递归编号增加

Recursive Number Addition

本文关键字:增加 编号 递归      更新时间:2023-10-16

我在看来是胭脂的总变量方面遇到了麻烦。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(。该呼叫将以某种方式返回剥离值的数字总和。然后,我们将数字添加到该值中,然后将总和返回给呼叫者。或列表表格:

  1. 让current_digit =输入%10#当前数字值
  2. 让剩下的_value =输入/10#剩余数字
  3. 让digit_sum =递归呼叫的结果,剩余_value至少10
  4. 返回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或类似的东西(,这是最不重要的数字和递归呼叫的结果,这些数字应返回其他数字的总和。