无法理解java palidrome输出

时间:2016-05-30 17:34:06

标签: java recursion

我有一个简单的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),所以理论上什么都不应该返回?

提前致谢!

3 个答案:

答案 0 :(得分:4)

这可以通过绘制递归树来理解。

location.origin

所以回文结构(5)最终会到达回文结构(0)和回文结构(1)。
注意:递归在回文结束(0)和回文(1)调用结束。

答案 1 :(得分:1)

让我们逐行了解N = 5的情况。

  1. 回文(5)被称为 - >我不是0或1 - >返回回文结果(3)+回文结构(4)+回文结构(3)
  2. 我们需要回文结果(3)来建立回文结果(5)。因此称为回文(3)。 - >我不是0或1 - >返回回文结果(1)+回文结构(2)+回文结构(1)
  3. 我们需要回文结果(1)来构建回文结果(3)。所以回文(1)被称为。 - > i = 1,因此返回“T”
  4. 我们需要回文结果(2)来构建回文结果(3)。因此,召唤回文(2)。 - >我不是0或1 - >返回回文结果(0)+回文结构(1)+回文结果(0)
  5. 我会在这里对递归进行釉面处理,但我们得到了“STS”以获得回文结果(2)。
  6. 这意味着我们得到回文结构(1)+回文结构(2)+回文结构(1)=“TSTST”用于回文结构(3)。
  7. 此结果将返回我们原来的回文(5)电话。
  8. 希望这有助于说明你的递归。

答案 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