递归数字加法

时间:2017-06-24 04:37:00

标签: c++ recursion

我遇到了看似胭脂总变量的问题。 sumDigits函数的目标是递归地将用户输入的每个数字添加到将显示的总数。我现在发现的是,当我将输入传递给输入时,也会获取该值。我可以得到关于最新情况的解释吗?

我的代码分解为简单的陈述:

#include <iostream>
using namespace std;

int sumDigits(int&);

int main()
{
int input = 123;
cout << sumDigits(input);
}

int sumDigits(int& input)
{
int total, newNumber;
if (input < 10)
return input;
else
{
newNumber = input%10;
total += newNumber;
input = input/10;
return sumDigits(input);
}
}

我的代码在测试时验证总数:https://pastebin.com/u1MS63Ji

当前代码的结果:

Welcome to the Sum of Digits Machine. Please type in your number or -1 to 
quit
enter a nonnegative integer: 1234
input: 1234 
Total: 1234  // total magically takes input value
newNumber: 0
Total: 1234
Total after: 1238 newNumber: 4  //total+=newNumber does its job.
input: 123
input: 123
Total: 1539161746 //how in the world? 1238 + 3 does not equal this....
newNumber: 32600
Total: 1539161746
Total after: 1539161749 newNumber: 3
input: 12
input: 12
Total: 1539161746
newNumber: 32600
Total: 1539161746
Total after: 1539161748 newNumber: 2
input: 1
input: 1
number is smaller than 10
the sum of all digits is: 1.
enter a nonnegative integer:  

有人可以向我解释为什么总数在sumDigits()开头输入值?我也非常感谢任何关于我做错的指示。

附注:希望这个澄清修复我的onHold。如果不是管理员,请告诉我你到底想要什么,因为我很快就会出现堆栈溢出。我还应该解释一下我试图研究这个问题的票数,但我没有好运。我还是学生,也是新手。

1 个答案:

答案 0 :(得分:0)

我认为这是&#34;正常&#34; (即标准)c ++。我也只检查新代码。

小问题:您正在使用单位化变量: - 你在第27行的单元化变量循环中进行测试, - 您在第82和83行中打印了单位化变量,

养成总是初始化变量的习惯,比如:

int total = 0, newNumber = 0;

现在算法:它错了。考虑第82-90行: 84:你计算数字值,好。 86:你将数字值添加到总数,如果总数将被初始化,这将是好的。但是,由于您要将总数初始化为零,因此无需添加。 88:你计算递归调用的输入,这很好。您通过引用使用调用者传递给您的变量,这在递归算法中很棘手,但让我们坚持下去。 90:你递归地打电话。

你没有对第84行的数字值做任何事情(除了将它添加到另一个局部变量)......

试试这个:

return newNumber + sumDigits(input);

并在第48行使用返回值(而不是输入):

int inputDigitSum = sumDigits(input);

更新: 您正在尝试使用递归算法计算数字总和。这些都是非常棘手的,难以解释和遵循。不过我们试试吧。

基本理念: 给定一些我们想要计算数字总和的整数值(输入),我们从中删除一个数字(最低位,使用%运算符)。然后我们递归调用相同的函数,其值由剩余数字组成(除以10的结果)。该调用将以某种方式返回剥离值的数字总和。然后我们将数字添加到该值并将总和返回给我们的调用者。或者以列表形式:

  1. let current_digit =输入%10#当前数字值
  2. 让remaining_value =输入/ 10#剩余数字
  3. 让digit_sum =递归调用的结果,如果至少为10
  4. ,则为remaining_value
  5. return digit_sum + current_digit
  6. 让我们试一下数字输入= 124:

     1. current_digit = 124 % 10 = 4
     2. remaining_value = 124 / 10 = 12
     3. recursive call with remaining_value = 12
     3.1. current_digit = 12 % 10 = 2
     3.2. remaining_value = 12 / 10 = 1
     3.3. recursive call with remaining_value = 1
     3.3.1. current_digit = 1 % 10 = 1
     3.3.2. remaining_value = 1 / 10 = 0
     3.3.3. no recursive call because remaining_value is less than 10
     3.3.4. return current_digit = 1
     3.4. return current_digit + call result = 2 + 1 = 3
     4. return current_digit + call result = 4 + 3 = 7
    

    现在回到你的职能部门。

    int sumDigits(int& input)
    {
      int total, newNumber;
      if (input < 10)
        return input; // (1)
      else {
        newNumber = input%10;    // (2)
        total += newNumber;      // (3)
        input = input/10;        // (4)
        int tmp = sumDigits(input); // (5)
        return tmp;              // (6)
      }
    }
    

    让我们使用相同的数字输入= 124:

    2. newNumber = input%10 = 124%10 = 4
    3. total += newNumber = random (total is unitialized, so its random + 4, still random)
    4. input = input/10 = 124/10 = 12
    5.2. newNumber = input%10 = 12%10 = 2
    5.3. total += newNumber = random
    5.4. input = input/10 = 12/10 = 1
    5.4.1. return input = 1 (because its less than 10)
    5.5. tmp = result of recursive call = 1
    5.6. return tmp = 1
    5. tmp = result of recursive call = 1
    6. return tmp = 1
    

    请注意,每次调用sumDigits都有自己的私有局部变量total和newNumber,并且它们不以任何方式相互连接。这就是为什么我建议返回newNumber的总和(应该称为lastDigit或类似的东西),是最不重要的数字和递归调用的结果,它应该返回其他剩余数字的总和。