我不太了解递归。我正在编写一个类程序,我将大部分程序转换为递归。所以,我的教授不希望我们使用循环,也不希望我们使用多个参数。
程序贯穿冰雹序列,而我遇到的函数会计算冰雹序列的长度。我让它按照我的方式工作,但想确认它是否符合他的标准。 (不符合他的标准。)
我想知道是否有更好的方法来完成这项功能。我尝试时遇到的问题是我不能使用静态变量,因为它永远不会重置计数器,并且会将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;
}
}
我原以为我需要制作一些能够计数的函数,因为它不能作为参数,或者在没有重置的函数中。
由于
答案 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.