我有一个简单的java程序,它接受一个数字并根据该数字执行一个函数。
public class Palidrome {
public static void main (String[] args) {
int N = 3;
System.out.println(palidrome(N));
}
public static String palidrome(int i) {
if (i == 0) return "S";
if (i == 1) return "T";
return palidrome(i-2)
+ palidrome(i-1)
+ palidrome(i-2);
}
}
因此,对于此示例N = 3,输出为“TSTST”。如果N更改为5,则输出为“TSTSTSTSTSTSTSTSTSTST”等。
我正在努力弄清楚为什么会这样。如果N = 5,则palidrome(i-1)和palidrome(i-2)永远不会达到(i == 0)或(i == 1),所以理论上什么都不应该返回?
提前致谢!
答案 0 :(得分:4)
这可以通过绘制递归树来理解。
location.origin
所以回文结构(5)最终会到达回文结构(0)和回文结构(1)。
注意:递归在回文结束(0)和回文(1)调用结束。
答案 1 :(得分:1)
让我们逐行了解N = 5的情况。
希望这有助于说明你的递归。
答案 2 :(得分:1)
palidrome
的每次连续递归调用都会让你更接近这里的基本情况:
if (i == 0) return "S";
if (i == 1) return "T";
所以理论上说
palidrome(i-1)和palidrome(i-2)永远不会达到(i == 0)或(i == 1)
错误,因为最终会达到这些语句,但在i
更改后才能满足条件。
var i
如何改变你可能想知道!通过这个声明:
return palidrome(i-2)
+ palidrome(i-1)
+ palidrome(i-2);
在这里,您以递归方式调用palidrome
,但(i
已减少),这最终将引导您进入基本情况。
如果你的函数从未到达base-case
,那么你将有一个无限递归,而这不是这里的情况。
为简化起见,请看一下这个例子:
假设你有一个慷慨的邻居,如果你曾经拜访他一次会给你一个苹果,如果你两次拜访他,还有另一个苹果,那么他会开始给你最后2次给你的东西(这实际上是一个fibonacci
序列)所以这里的一般情况是:
numberOfApplesThatYouGet= numberOfApplesThatYou'veGotIn(currentVisitNumber-1(Which is Last Visit))+numberOfApplesThatYou'veGotIn(currentVisitNumber-2)
让我们假设
currentVisitNumber = n and numberOfApplesThatYouGet = a method called fib
所以一般规则将是 - >
fib(n)=fib(n-1)+fib(n-2)
但我们仍然需要base-case
来终止无限递归,而基本情况是您第一次访问的条件
if(n==0) return 0;//if you didn't visit him you'll get nothing
if(n==1) return 1;//if you did you'll get an apple
所以方法将如下所示:
public int fib(int n) {
if(n == 0)
return 0;
else if(n == 1)
return 1;
else
return fib(n - 1) + fib(n - 2);
}
假设你让他三次访问,你会得到多少苹果?
fib(3)->fib(2)+fib(1)
fib(2)->fib(1)+fib(0)->1+0->1
fib(1)->1
1+1=2
#done
另外,请查看此内容,以便更好地了解recursion。