繁体   English   中英

如何将循环转换为递归?

[英]How do I convert loops to recursions?

我不太了解递归。 我正在开发一个类程序,并且将大部分程序转换为递归。 因此,我的教授不希望我们使用循环,也不想我们使用多个参数。

该程序遍历冰雹序列,而我遇到的函数无法计算冰雹序列的长度。 我按照自己的方式进行了工作,但想确认它是否符合他的标准。 (不符合他的标准。)

我想知道是否有更好的方法可以执行此功能。 我尝试时遇到的问题是我无法使用静态变量,因为它永远不会重置计数器,并且将冰雹序列从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;
    }
}

我当时想我需要制作一些可以计数的函数,因为它不能成为参数,或者需要在函数中不进行复位。

谢谢

首先,您通过引入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;
}

这将满足您的需求。 您不需要尾部递归函数来跟踪该函数递归的次数,这实际上就是您要跟踪的地方。

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

没有真正的通用公式可以将迭代循环分解为递归函数调用,但是在此处进行操作时消除循环不变性是一个基本思路。

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

相反,您可以做的是返回hailstoneLength(hailNext(u + 1)),以便在下一个循环迭代中将调用hailstoneLength(n + 1)(我相信这是您尝试执行的操作的一般原理)做)。 对于它的价值,我认为您不需要int = 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。

暂无
暂无

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

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