繁体   English   中英

如何编写循环函数作为递归函数?

[英]How do I write a loop function as a recursive function?

好吧,我已经尝试了很多次。 但是,有一点我认为longestSequence函数会有所帮助,因为它显示了最长的冰雹序列。 虽然,我似乎无法弄清楚如何查找或存储用于查找的值,如果有人可以解释如何做,我将不胜感激。

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开头的最长冰雹序列的长度为9。

因为9的序列长度为20个数字,并且从1到10最长。

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

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

转换为:

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

func(0);

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

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

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;   
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM