如何将循环转换为递归?

时间:2017-02-08 02:13:48

标签: c++ recursion

我不太了解递归。我正在编写一个类程序,我将大部分程序转换为递归。所以,我的教授不希望我们使用循环,也不希望我们使用多个参数。

程序贯穿冰雹序列,而我遇到的函数会计算冰雹序列的长度。我让它按照我的方式工作,但想确认它是否符合他的标准。 (不符合他的标准。)

我想知道是否有更好的方法来完成这项功能。我尝试时遇到的问题是我不能使用静态变量,因为它永远不会重置计数器,并且会将hailstone序列从1到n总计。我也尝试过将计数留在我的函数中,尽管当我做手动模拟时(因为我拒绝相信它重置的次数比我想要的多)并且每次都看到它重置。此外,无需回答。

我宁愿自己想一想,所以我想看看是否有人可以给我一个“公式”或一些指南来跟随转换循环到递归。 作为参考,我将粘贴我的hailstoneLength代码,找到冰雹序列的长度。但是,如果你想告诉我该怎么做它是否可以解释它是如何工作的呢?我很可能会做一些手工模拟来解决它。

循环:

int hailstoneLength(int n)
{
    int count = 1;
    int u = n;
    while(u != 1)
    {
        u = hailNext(u);
        count++;
    }
    return count;
}

递归:

int hailstoneLength(int n, int count = 1) 
{
    int u = n;
    if(u != 1)
    {
        return hailstoneLength(hailNext(u), count + 1);
    }
    else // if u = 1
    {
        return count;
    }
}

我原以为我需要制作一些能够计数的函数,因为它不能作为参数,或者在没有重置的函数中。

由于

3 个答案:

答案 0 :(得分:1)

首先,你通过引入u作为一个无关的变量让你感到困惑。非递归函数可以简化为

int hailstoneLength(int n)
{
    int count = 1;
    while(n != 1)
    {
        n = hailNext(n);
        count++;
    }
    return count;
}

由此可以轻松生成递归形式

int hailstoneLength(int n)
{
    if (n != 1)
        return hailstoneLength(hailNext(n)) + 1;
    else
        return 1;
}

可以重新设置,以便在n == 1时停止递归。

int hailstoneLength(int n)
{
    if (n == 1)
        return 1;
    else
        return hailstoneLength(hailNext(n)) + 1;
}

甚至(显而易见,这可以用尾递归形式写出来)....

int hailstoneLength(int n)
{
    if (n == 1) return 1;
    return hailstoneLength(hailNext(n)) + 1;
}

答案 1 :(得分:0)

这可以满足您的需求。您不需要尾递归函数来跟踪函数递归的次数,这实际上就是您在这里跟踪的内容。

cursor.MoveToNext()

没有真正的通用公式可以将迭代循环分解为递归函数调用,但是消除循环不变量就像我们在这里做的那样是一般的想法。

答案 2 :(得分:0)

您已将返回类型定义为int,但是hailstoneLength(hailNext(u),count + 1)似乎不是int。

相反,你可以做的是返回hailstoneLength(hailNext(u + 1)),这样在下一个循环迭代中它将调用hailstoneLength(n + 1)(我相信这是你背后的一般原则)重新尝试)。对于它的价值,我认为你不需要int u = n。

我不知道hailNext会做什么,所以我无法进一步帮助,但你肯定想确保你在递归函数中返回一个int(这通常意味着你不能有多个输入)。

看一下这个递归函数来做一个阶乘,供参考:

int myFactorial( int integer)
{
if( integer == 1)
    return 1;
else
   {
   return (integer * (myFactorial(integer-1)));
   }
}

假设整数为5。

返回(5 *(myFactorial(integer-1)))

所以在下一次迭代中,整数是4。

所以它将返回4 *(myFactorial(integer-1)))

等等!最后它将返回5 * 4 * 3 * 2 * 1.