【问题标题】:Binary To Decimal Recursion - without global variable二进制到十进制递归 - 没有全局变量
【发布时间】:2014-04-24 03:35:21
【问题描述】:

我正在学习 C++ 中的递归,并且作为实践,我试图用递归函数编写二进制到十进制转换器。在以下代码转换器中正常工作:

#include <iostream>
#include <cmath>
#include <bitset>
using namespace std;

int sum = 0;

int DecimalConversion (int power, int number){      
    int bit;

    if (number == 0)
    {
        return 0;
    }

    bit = number % 10;
    sum = sum + bit * pow(2, power);
    number /= 10;
    power++;

    DecimalConversion(power, number);
    return sum;

    //return bit * pow(2, power) + DecimalConversion(power, number);
}

int main(){
    int power = 0;
    int number = 0;

    cout <<  "Enter binary number: " << endl;
    cin >> number;
    cout << "Number is: " << DecimalConversion(power, number);

    system("PAUSE >> NULL");
    return 0;
}

不使用全局变量是否可以从DecimalCoonversion 函数返回值?谁能解释一下,我尝试了下一行代码,但它不能正常工作:

return bit * pow(2, power) + DecimalConversion(power, number);

谁能解释我使用前一行代码出错的地方? 提前谢谢你

【问题讨论】:

  • 提示:你应该使用对DecimalConversion的递归调用的返回值。
  • Mmm no ...`变量“sum”正在使用而没有被初始化。`我抛出了异常,这就是我使用全局变量的原因 - 因为我不能在里面使用int sum=0;功能
  • @hajrovica 我第一次看错了,抱歉。请参阅我的答案以获取更新的回复。
  • @hajrovica 您注释掉的那一行对我来说效果很好。它有什么问题? (您根本不需要 sum 变量。)
  • 是的,我注释掉了作品,但它没有计算出正确的值

标签: c++ recursion


【解决方案1】:

这会将sum 作为参数添加到您的函数中,但如果您未明确提供,则默认为0。电源也默认为0,这样您就不必将其传递给函数。

由于默认参数必须在函数声明和/或定义参数列表的末尾,我不得不移动power来实现这一点。

#include <iostream>
#include <cmath>
#include <bitset>
using namespace std;

int DecimalConversion (int number, int power = 0, int sum = 0) // changes here
{  
    if (number == 0)
    {
        return sum;
    }

    int bit = number % 10;
    sum = sum + bit * pow(2, power);
    number /= 10;
    power++;

    return DecimalConversion(number, power, sum); // changes here
}

int main(){
    int number = 0;

    cout <<  "Enter binary number: " << endl;
    cin >> number;
    cout << "Number is: " << DecimalConversion(number);

    system("PAUSE >> NULL");
    return 0;
}

请注意,我没有检查这实际上是否正确地将二进制转换为十进制,只是递归有效。

你可以这样调用这个函数:

DecimalConversion(number);

【讨论】:

  • Power 也可以在参数中初始化为零,因为 OP 在 main 中这样做了。
  • 好的递归在这个例子中有效,但问题是这不会返回任何东西——这个调用的结果是 0。DecimalConversion 函数中应该有return sum;。我还需要转换器来计算正确的值。所以我添加了DecimalConversion(number, power, sum); return sum; - 这仅返回第一个 sum = 1 也尝试添加 return sum + DecimalConversion(number, power, sum); - 它不计算正确输入的二进制值 111 它返回 11 它应该是 7。对此有什么帮助吗?跨度>
  • 当我运行它时,它按预期返回 7。我已经添加了其余的源代码供您查看。
【解决方案2】:

这个:

int DecimalConversion(int power, int number){
    if (number == 0)
        return 0;
    else
        return (number % 10)*pow(2, power) + dc(power+1, number/10);
}

int DecimalConversion(int power, int number){
    return number?(number % 10)*pow(2, power) + dc(power+1, number/10):0;
}

【讨论】:

  • 第二个怎么样?它更难阅读,而且你从第一次使用它就没有任何收获。
  • 我同意。第二个只是对if/else 的不同解释。它并没有让它“更好”。
  • @OMGtechy:只有感觉,我知道……但是“更好”被删除了
猜你喜欢
  • 2015-01-15
  • 1970-01-01
  • 1970-01-01
  • 2017-01-26
  • 2016-05-03
  • 2014-12-05
  • 1970-01-01
  • 2016-01-17
  • 2014-04-18
相关资源
最近更新 更多