我遇到了看似胭脂总变量的问题。 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。如果不是管理员,请告诉我你到底想要什么,因为我很快就会出现堆栈溢出。我还应该解释一下我试图研究这个问题的票数,但我没有好运。我还是学生,也是新手。
答案 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的结果)。该调用将以某种方式返回剥离值的数字总和。然后我们将数字添加到该值并将总和返回给我们的调用者。或者以列表形式:
让我们试一下数字输入= 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或类似的东西),是最不重要的数字和递归调用的结果,它应该返回其他剩余数字的总和。