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

时间:2016-09-23 04:47:48

标签: c++ recursion

好吧,我一直试图重做这么多次。虽然,有一次我认为最长的序列函数会有所帮助,因为它显示了最长的冰雹序列。虽然,我似乎无法弄清楚如何找到或存储它用于找到它的价值。如果有人可以解释如何,我会很感激。

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循环,但我确信我们不应该使用循环。 这可能是一个愚蠢的问题,但如果有人知道,那么是否存在将循环转换为递归的公式?

预期的出局是这样的:

从最长10的数字开始的最长的冰雹序列长度为20。 从最长10开始的最长的冰雹序列从9开始。

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

2 个答案:

答案 0 :(得分:3)

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

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

将其翻译为:

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

func(0);

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

答案 1 :(得分: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;   
}

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