首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++中使用递归的倒数函数

C++中使用递归的倒数函数
EN

Stack Overflow用户
提问于 2013-07-18 14:18:38
回答 7查看 22K关注 0票数 2

下面是一个使用递归返回一个数字的倒数的函数。但是,它只返回数字的最后一位。我想知道为什么以及如何修复它?

代码语言:javascript
运行
复制
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;

      }
}

谢谢!

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-07-18 14:55:41

下面是一些有效的代码:

代码语言:javascript
运行
复制
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没有保留在调用中。这是制作递归函数时的一个常见问题。

为了解决这个问题,每个函数调用都会计算"base“,而不是有一个固定值。这也更好一些,因为它允许传递更大的数字,而不是不大于100的数字(您选择的代码的另一个限制)。

另一个实现是将base作为第二个参数,这样就不必在每次函数调用时都重新计算它。然而,这可以很容易地通过一个简单的宏来解决。调用可能是:

代码语言:javascript
运行
复制
int rev_number (int number, int base){ .. }

但是a可以方便地放在宏中(或其他函数调用中):

代码语言:javascript
运行
复制
#define rev(num) rev_number (number, 0)

这会更有效一点,但区别可能很重要,也可能不重要。

票数 12
EN

Stack Overflow用户

发布于 2014-07-25 19:35:52

这就是解决方案。

调用下面的函数作为reverse (number, 0);

代码语言:javascript
运行
复制
int reverse(long int n, long int rev) {
    if(n == 0)
        return rev; 
    return reverse(n / 10, rev * 10 + n % 10);
}
票数 9
EN

Stack Overflow用户

发布于 2013-07-18 15:20:11

代码语言:javascript
运行
复制
int rev(int num){
    return num < 10 ? num : (num % 10) * pow(10, (int)log10(num)) + rev(num/10);
}

而且它是在一行中完成的。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17715918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档