我的工作是为这个方法编写一个递归版本。据我所知,递归是从一个基本调用(如果有什么东西,那么返回)开始,然后是另一个调用,它将返回到原来的基。就像从一个甲板开始,添加到甲板上,然后从甲板上移出卡片,直到你回到原来的甲板。考虑到这一点,这里就是。
public static long fact(int n)
{
long result = 1;
while(n > 0)
{
result = result * n;
n = n - 1;
}
return result;
}
//我的递归版本:
public static void recFact(int n)
{
if(n==0)
{
return n; // ir 0 it really doesn't matter right?
}
else
{
return recFact(n-1);
}
}
这只是我即将进行的考试的一个例子测试问题,只是想确保我有一个递归的处理方法。我做得对吗?如果不是的话,我错过了什么?请不要回答任何问题,只要告诉我我做错了什么,也许还有一些更好的理解方法的建议。
谢谢。
发布于 2014-06-08 22:01:11
不,这个递归解决方案是不正确的。
对于每一个正的n
,您只是返回rectFact(n-1)
,这将追索权直到您到达0
,此时它将返回。换句话说,函数将始终返回0
。您忽略了将当前n
与rectFact(n-1)
相乘的部分。另外,注意0!
是1,而不是0:
public static int recFact(int n)
{
if(n==0)
{
return 1;
}
else
{
return n * recFact(n-1);
}
}
最后,由于if
子句返回,所以else
有点多余。当然,这不会影响方法的正确性,但是IMHO --如果没有它,代码看起来会更干净:
public static int recFact(int n)
{
if(n==0)
{
return 1;
}
return n * recFact(n-1);
}
发布于 2014-06-08 22:00:49
您的递归版本不需要乘法,它将对任何输入返回零。所以不,你做得不对。
但是,递归版本确实是递归的,所以您可以使用递归版本!要了解出了什么问题,就先看看一个非常简单的案例。
客户端调用recFact(3)
这将返回到客户端recFact(2)
。
将返回到上面的recFact(1)
将返回到上面的recFact(0)
它将返回到上面的0
。
有两件事出了问题:
好的态度,不想要的解决办法交给你!希望这些指点能帮你解决问题。
编辑:很明显,我误解了你的语法,而你确实想要解决办法。
发布于 2014-06-08 22:05:57
任何递归函数都需要三件事:
result = result * n
。--这是您的递归版本中缺少的!recFact
的结果,这样您就可以将它包含在调用链的更高层处理中。请注意,您说的是return recFact(n - 1)
,但在定义中,recFact
返回void
。那可能是一个int
。https://stackoverflow.com/questions/24111228
复制相似问题