递归编号增加
Recursive Number Addition
我在看来是胭脂的总变量方面遇到了麻烦。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((开始时要占用输入值?同样,对我做错了什么的任何指示都将不胜感激。
旁注:希望这种澄清固定了我的内心。如果不是管理员,请确切地告诉我您想要什么,因为我很新来堆叠溢出。我还应该解释一下我试图研究这个问题的低调投票,但没有好运。我仍然是学生,也是新手。
我认为这是"正常"(即标准(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(。该呼叫将以某种方式返回剥离值的数字总和。然后,我们将数字添加到该值中,然后将总和返回给呼叫者。或列表表格:
- 让current_digit =输入%10#当前数字值
- 让剩下的_value =输入/10#剩余数字
- 让digit_sum =递归呼叫的结果,剩余_value至少10
- 返回digit_sum current_digit
让我们在数字输入= 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的每个呼叫都有其自己的私人本地变量总计和纽纳姆伯,并且它们不会以任何方式相互连接。这就是为什么我建议返回newnumber的总和(应该称为LastDigit或类似的东西(,这是最不重要的数字和递归呼叫的结果,这些数字应返回其他数字的总和。
- 数组索引的值没有增加
- 为什么我的代码在输出中增加了93天
- 有效地使用std::unordered_map来插入或增加键的值
- C++ 动态数组每次添加时将大小增加 1 - 错误
- 为什么要增加导致崩溃的指针
- 如何在数组中找到最小编号的索引号?
- 增加传递地址的值
- 贪婪算法编号列表
- 如何增加以前由新运算符分配的 C++ std::list 数组的大小?
- 为什么在尝试测量函数返回所需的时间时,我的运行时编号是错误的?
- 为什么"i"在循环的每次迭代中都没有增加?(C++)
- std::thread 增加 DLL 引用计数,从而防止卸载 DLL
- 为什么在为其分配编号后无法显示我的字符串值?
- 如何在C++中为增加但记住删除先前对象的对象分配唯一标识符
- 将一对插入地图并增加计数?
- 整数类型应该显式转换(例如"int"到"无符号")还是只会增加混乱?
- 我的 c++ 应用程序中的运行时间从 0 增加到 60 太快了(例如一毫秒或一微秒)
- 为什么当通过 TCP 发送的消息速率增加时,请求-响应消息对的延迟会降低?
- 递归编号增加
- 使用MKL并行SPMV随着螺纹编号的增加而减慢