【问题标题】:How do I write a loop function as a recursive function?如何将循环函数编写为递归函数?
【发布时间】:2016-09-24 03:39:14
【问题描述】:

嗯,我已经尝试过多次返工。不过,有一次我认为最长的序列函数会有所帮助,因为它显示了最长的冰雹序列。虽然,我似乎无法弄清楚如何找到或存储它用来找到它的价值。如果有人能解释如何,我将不胜感激。

int longestSequence(int n)
{
    int u = n;

    if(u == 1)
    {
        return 1;
    }
    else 
    {
        return max(hailstoneLength(u), longestSequence(u-1));
    }
}

我遇到问题的部分是我最长的开始序列:

int hailLongestSeq(int n)
{
    int k;
    int longest = 0;
    for(int j = 1; j <= n; j++)
    {
        if(hailstoneLength(j) > longest)
        {
            longest = hailstoneLength(j);
            k = j;
        }
    }
    return k;   
}

我不确定如何将其变成递归,我注意到在一些递归中我看到人们仍在使用 for 循环,但我确信我们不应该使用循环。 这可能是一个愚蠢的问题,但是如果有人知道的话,是否有将 for 循环转换为递归的公式?

预期的输出是这样的:

以不超过 10 的数字开头的最长冰雹序列的长度为 20。 从 10 到 10 的最长冰雹序列以 9 开​​头。

因为 9 的序列有 20 个数字,最长的是 1 到 10。

【问题讨论】:

  • 你昨天不是问过这个吗?
  • 这个公式是根据子问题对问题进行改写:例如:n 次迭代的 for 循环是对 n-1 次迭代的 for 循环的迭代
  • 不,我昨天没有问这个。我今天凌晨 1 点提交的

标签: c++ recursion


【解决方案1】:

是的,每个 for 循环都可以转换为递归调用,显然是这样的:

for (i=0; i<N; i++) {
  body;
}

翻译成:

func(int i) {
  if (i<N) { body; func(i+1) }
  else return;
}

func(0);

这可以很容易地扩展到任何 for 循环计算(如果需要,添加参数、返回值等)。

【讨论】:

  • 哇。谢谢!我还在学习 C++。我可能应该保存它以备不时之需。
  • 当我这样做时,我遇到了分段错误。我该如何解决?还是我在做任何事情?
【解决方案2】:

您可以在函数的参数签名中添加要保留其值的局部变量。我试图将代码重写为递归。检查并验证这是否能解决您的问题。

int hailLongestSeq(int n, int j, int k, int longest)
{
    if(j <= n)
    {
        if(hailstoneLength(j) > longest)
        {
            longest = hailstoneLength(j);
            k = j;
        }
        k = hailLongestSeq(n, ++j, k, longest);
    }
    return k;   
}

这可能需要修复,但逻辑保持不变,将变量作为参数传递以保留值。

【讨论】:

  • 与此相同,我遇到了分段错误
  • 抱歉,我添加了 j++ 而不是 ++j,这导致了无限循环。我现在修改了代码。您能否再次检查并确认它是否适合您。
  • 哦,是的,它适用于 Rishabh,谢谢。谢谢,如果可以的话,如果我能解释一下它是如何工作的,可以吗?我正在做更多的手部模拟。
  • 老实说,我只是将您的循环逻辑转换为递归。转换循环的第一件事是根据您的循环条件创建一个条件。如果满足条件,则再次调用该函数,否则返回输出。还要确保在进行递归调用时,函数中使用的所有局部变量都作为参数传递。对于复杂的任务,我总是发现先编写循环然后将其转换为递归函数会更好。继续练习。如果你明白了,请点赞。
  • 我现在明白了,虽然很抱歉,我不能投票,因为我没有 15 个代表,但我注意到上面也有解释。当我按照他们的方式进行时,结果是一样的。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-16
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
  • 1970-01-01
相关资源
最近更新 更多