我寫了一個用遞回反轉整數(123 變為 321)的函式,有人告訴我使用全域變數是不好的做法,但我無法弄清楚如何在不使用函式的情況下從函式中獲取結果。我嘗試在函式內宣告變數,但后來我得到了不希望的結果。
#include <stdio.h>
int result = 0;
int reverse_num(int num)
{
int remainder = num % 10;
if (num == 0) return 0;
result *= 10;
result = remainder;
reverse_num(num / 10);
return result;
}
int main(void)
{
int num, reversed_num;
printf("Insert number: ");
scanf("%d", &num);
reversed_num = reverse_num(num);
printf("Inverted number: %d", reversed_num);
return 0;
}
感謝您提供任何幫助。
uj5u.com熱心網友回復:
執行此操作的常用方法是僅針對累積結果使用另一個引數。它可以在 C 中通過將您的函式拆分為用戶呼叫的函式和完成所有作業的函式來完成。
int reverse_num_helper(int num, int result)
{
int remainder = num % 10;
if (num == 0) return result;
result *= 10;
result = remainder;
return reverse_num_helper(num / 10, result);
}
int reverse_num(int num)
{
return reverse_num_helper(num, 0);
}
(在 C 中,您可以將兩者組合成int reverse_num(int num, int result = 0).)
請注意您的功能基本上沒有變化。
我們只做了兩個小的修改:
- 達到零時回傳
result而不是零num result使用修改后的值呼叫遞回
uj5u.com熱心網友回復:
有很多方法。一種方法是在每次遞回中找到最重要的十進制數字。
下面是一個低效的例子。
對于 0 到 near 的某些值可以正常作業INT_MAX/10。
#include <stdio.h>
int reverse_num(int num) {
if (num < 10) {
return num;
}
int pow10 = 10;
while (num/pow10 >= 10) {
pow10 *= 10;
}
int lead_digit = num/pow10;
return reverse_num(num % pow10) * 10 lead_digit;
}
int main() {
printf("%d\n", reverse_num(123456789));
printf("%d\n", reverse_num(1));
printf("%d\n", reverse_num(100));
}
輸出
987654321
1
1
其他人失敗printf("%d\n", reverse_num(123000789));-> 987321。
改進:遞回和高效。
static int reverse_num_helper(int num, int power10) {
if (power10 < 10) {
return num;
}
return reverse_num_helper(num % power10, power10 / 10) * 10 num / power10;
}
int reverse_num(int num) {
int pow10 = 1;
while (num / pow10 >= 10) {
pow10 *= 10;
}
return reverse_num_helper(num, pow10);
}
int main() {
printf("%d\n", reverse_num(123000789));
printf("%d\n", reverse_num(123456789));
printf("%d\n", reverse_num(123));
printf("%d\n", reverse_num(1));
printf("%d\n", reverse_num(100));
}
輸出
987000321
987654321
321
1
1
uj5u.com熱心網友回復:
int Reverse(int n,int Len) {
if (n == 0)
return 0;
return std::pow(10, Len-1)*(n % 10) Reverse(n / 10, Len-1);
}
//inside main
Reverse(54321,5);
//Output Should be 12345
uj5u.com熱心網友回復:
@chux 給出的稍微冗長的版本可能會更清晰一些。
#include <stdio.h>
int count_places(int num);
int reverse_by_places(int num, int num_places);
int ipow(int base, int power);
int reverse_num(int num)
{
return reverse_by_places(num, count_places(num)) / 10;
}
int ipow(int base, int power)
{
if (power == 0)
return 1;
return base * ipow(base, power-1);
}
int count_places(int num)
{
int i;
if (num == 0)
return 1;
for (i = 0; num > 0; i )
{
num /= 10;
}
return i;
}
int reverse_by_places(int num, int num_places)
{
int dividend = num / 10, remainder = num % 10;
if (dividend == 0)
return remainder * ipow(10, num_places);
else
return ((remainder * ipow(10, num_places)) reverse_by_places(dividend, num_places-1));
}
int main(void)
{
int num, reversed_num;
printf("Insert number: ");
scanf("%d", &num);
reversed_num = reverse_num(num);
printf("Inverted number: %d\n", reversed_num);
return 0;
}
uj5u.com熱心網友回復:
為了使它與您的原始代碼相似,只是沒有全域變數,請嘗試以下操作:
#include <stdio.h>
#define RESET (-1)
int reverse_num(int num)
{
static int result = 0;
int remainder = num % 10;
if (num < 0) {
result = 0;
return 0;
}
if (num == 0) return 0;
result *= 10;
result = remainder;
reverse_num(num / 10);
return result;
}
int main(void)
{
int num, reversed_num;
printf("Insert number: ");
scanf("%d", &num);
reverse_num(RESET);
reversed_num = reverse_num(num);
printf("Inverted number: %d\n", reversed_num);
return 0;
}
在這里,我只是在函式中制作result了一個區域static變數,這意味著即使函式回傳,它也會保持其值(就像一個全域變數,只是它的作用域只在函式內)。問題是,如果您想多次呼叫它,則需要一種重置result值的方法;我通過使用負值num作為信號量來重置。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/439494.html
上一篇:在Haskell中計算2個整數之間的回文數的線性遞回方法
下一篇:遞回方法即使有條件也不會停止
