【问题标题】:Wrong Answer with Recursive Sum Task递归求和任务的错误答案
【发布时间】:2018-10-18 04:02:32
【问题描述】:

我正在解决一个问题,使用递归打印总和等于给定数字 n 的所有非递增子序列。我知道我的递归算法有问题,但是我已经多次完成了这个过程,但我找不到我的错误。输入 4,我的代码给出输出:

4 431 4322 432211 43213 4321321 43213212 4321321211 我相信递归会保留过去递归调用中使用的先前数字或总和,但找不到原因。谁能帮我弄清楚为什么程序没有给出正确的输出?

#include <iostream>
#include <string>

using namespace std;

int n;

void sums(int sum, string str)
{
  if (sum==n)
  {
    cout << str << "\n";
    return;
  }
  for (int i = n-sum; i >= 1; i--)
  {
    str+=to_string(i);
    sums(sum+i, str);
  }
}

int main()
{
  cin >> n;
  string s = "";
  sums(0, s);
}

【问题讨论】:

  • 您将号码添加到str,然后将其交给函数。所以第一个调用会是str = "4",然后你将它传递给sums,然后是sum = "43",等等
  • 是的,但是 return 语句将我们还原为循环递归调用之前的总和。
  • 按照您的期望,正确的输出应该是什么?
  • 1 1 1 1 [空格] 2 1 1 [空格] 2 2 [空格] 31 [空格] 4
  • 在第一次调用 sums(0,"") 之后,下一个递归调用将是 sums(4, "4") ,它将打印 "4" 而不是 1

标签: c++ recursion sequence


【解决方案1】:

问题出在你的 for 循环中:str+=to_string(i);

在第一次调用时,总和为 0,str = "",在 for 循环中,它从 i = 4,i-- 开始。但是在正文中,您附加到 str += 4 并调用 sums(4, "4"),错误发生在下一个循环 i--, str += "3" 并变为 "43" 和 sums(3, "43");

你可以通过不修改 str 来修复它,但调用 sums(sum + i, str + to_string(i));

【讨论】:

    【解决方案2】:

    根据我对递归函数的理解,我相信根本不应该有循环!所以,替换:

    for (int i = n-sum; i >= 1; i--)
    {
      str+=to_string(i);
      sums(sum+i, str);
    }
    

    作者:

    str+=to_string(n-sum);
    sums(n-sum, str);
    

    【讨论】:

      猜你喜欢
      • 2018-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多