[英]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.