Mic*_*lva 3 c recursion reverse function
以下是一个函数,用于使用递归返回数字的反转.但是,它只返回数字的最后一位数字.我想知道为什么以及如何解决它?
int rev(int number)
{
int revNum=0, sum=100;
if(number<=9) return(number);
else if(number>0)
{
return(rev(number/10)+revNum);
revNum=(number%10)*sum; sum=sum/10;
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢!!!
tay*_*10r 10
这是一些有效的代码:
int rev (int number){
int base = 1;
while (number / (base * 10)){/*
* This calculates the base of the number
* ie number = 435
* base = 100
*/
base *= 10;
}
if (number <= 9){
return number;
} else if (number >= 10){ // notice different expression
int revNum = (number % 10) * base; // this was out of order
return rev (number / 10) + revNum;
}
}
Run Code Online (Sandbox Code Playgroud)
除了我上面评论的内容之外,你的代码无法工作的主要原因sum是在调用中没有保留.这是制作递归函数时的常见问题.
为了解决这个问题,每个函数调用计算"基数",而不是具有固定值.这也有点好,因为它允许传递更大的数字,而不是不大于100(你选择的代码的另一个限制).
另一种实现方式是将基数作为第二个参数,这样就不必每次调用函数都重新计算它.但是,这可以通过简单的宏轻松解决.电话可能是:
int rev_number (int number, int base){ .. }
Run Code Online (Sandbox Code Playgroud)
但是a可以方便地放在宏(或其他函数调用)中:
#define rev(num) rev_number (number, 0)
Run Code Online (Sandbox Code Playgroud)
这有点效率,但差异可能重要也可能不重要.
这是解决方案.
调用以下功能为 reverse (number, 0);
int reverse(long int n, long int rev) {
if(n == 0)
return rev;
return reverse(n / 10, rev * 10 + n % 10);
}
Run Code Online (Sandbox Code Playgroud)
int rev(int num){
return num < 10 ? num : (num % 10) * pow(10, (int)log10(num)) + rev(num/10);
}
Run Code Online (Sandbox Code Playgroud)
它完成了一行.