[英]Reverse Numbers function using recursion in C
以下是一个函数,旨在使用递归返回数字的倒数。 但是,它只返回数字的最后一位。 我想知道为什么以及如何解决它?
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;
}
}
谢谢!!!
这是一些工作代码:
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;
}
}
除了我上面评论的内容之外,您的代码无法工作的主要原因是sum
没有保留在调用中。 这是制作递归函数的常见问题。
为了解决这个问题,每次函数调用都会计算“基数”,而不是固定值。 这也好一点,因为它允许传递更大的数字,而不是不大于100
(您选择的代码的另一个限制)。
另一种实现是将基数作为第二个参数,这样就不必在每次函数调用时重新计算它。 但是,这可以通过一个简单的宏轻松解决。 电话可能是:
int rev_number (int number, int base){ .. }
但是 a 可以方便地放在宏(或其他函数调用)中:
#define rev(num) rev_number (number, 0)
这会更有效一点,但差异可能重要也可能不重要。
这就是解决方案。
调用下面的函数作为reverse (number, 0);
int reverse(long int n, long int rev) {
if(n == 0)
return rev;
return reverse(n / 10, rev * 10 + n % 10);
}
int rev(int num){
return num < 10 ? num : (num % 10) * pow(10, (int)log10(num)) + rev(num/10);
}
它是在一行中完成的。
您好 一个小的更正您的代码返回输入数字的第一位数字(不是最后一位数字)。 这是原因
在返回这样的值后,您正在计算 revNum
return(rev(number/10)+revNum);
revNum=(number%10)*sum; sum=sum/10;
因此第二个语句无效。
revNum也是一个局部变量
因此,每次当您调用递归函数时,都会创建sum (局部变量)和 revNum 的新本地副本,并分别使用 0 和 100 进行初始化。
你的递归树看起来像这样,例如596是传递给递归函数的数字。
rev(596) //call from main
rev(59)-->rev(5) // these are recursive calles
现在 rev(5) 将 5(since 5 < 9) 返回给调用者,即从那里到 rev(59) 到主调用者,结果显示第一个数字,在这种情况下它是 5。
如何解决?
要解决该问题,您必须在计算反向数后使它们成为全局变量(sum 和 revNum)并且 return 语句应该在最后。 这是简单的代码。
我将反向变量设置为全局变量以保留其中的更改,最后我将其返回给调用者。
#include <stdio.h>
int reverse; //globally declared
int rev(int revNum)
{
if(revNum)
{
reverse = (reverse * 10) + (revNum % 10);
rev(revNum/10); //recursive call
}
else
return; //return back to caller when revNum becoms 0
return reverse;
}
int main()
{
int num;
printf("Enter a number:");
scanf("%d",&num);
printf("Reverse Number is:%d\n",rev(num));
return 0;
}
这是一个简单的初学者问题,所以我认为我们也需要编写一个简单的代码来回答它。 这样我们就不需要创建新的变量。
n%10
给了我们最后一个数字,首先我们打印最后一个,然后我们调用反向函数增益,但现在使用参数n/10
所以我们摆脱了已经打印的最后一个数字。
代码
int reverse(int n)
{
if(n<10)
printf("%d",n);
else
{
printf("%d",n%10);
reverse(n/10);
}
}
可能是这个片段有帮助:
//init reversed number with last digit of number
reversed_number=number % 10;
//remove the last digit of number
number=number / 10;
//if number has another digit...
while (number > 0)
{
//...shift left all digits of the reversed_number by one digit
// and add the last digit of number
reversed_number=reversed_number*10+(number % 10);
//remove the last digit of number
number=number / 10;
}
……稍后补充……
递归变体看起来像这样(我使用了两个函数来获得所需的签名):
int rev(int number)
{
return rev_ext(0,number);
}
int rev_ext(int result, int number)
{
if (number<10)
{
return result*10+number;
}
else
{
result=result*10 + number % 10;
return rev_ext(result, number / 10);
}
}
我相信它可以写得更短/优化;-)
*约斯特
这是递归解决方案:
#include <stdio.h>
#include <string.h>
main()
{
int pow(int a, int b){
int p = 1;
while(b){
p = p * a;
b--;
}
return p;
}
int len(int number) {
int i = 0;
while (number) {
number/=10;
i++;
}
return i;
}
int rev(int number) {
int revNum=0;
int i = len(number) - 1;
if(number<=9) {
return number;
} else {
return(number%(10)*pow(10,i) +rev(number/10));
}
}
printf("%d",rev(1234));
}
检查此递归版本。
#include <stdio.h>
#include<math.h>
int main()
{
int n=345;
printf("%d",rev(n));
}
int len(int number)
{
int i;
for(i=0;number>0;number=number/10,i++);
return i;
}
int rev(int n)
{
if (n==0) return 0;
int val=0;
val=n%10;
return (val * pow(10,len(n)-1)+rev(n/10));
}
这是我的
int reverseTheNumber(int number, int reverseNumber) {
if (number != 0) {
reverseNumber += number % 10;
reverseNumber *= 10;
return reverseTheNumber(number / 10, reverseNumber);
}
else {
return reverseNumber / 10;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.