理解java palidrome输出时遇到问题

理解java palidrome输出时遇到问题,java,recursion,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 "

我有一个简单的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,输出为“tst”。如果N变为5,则输出为“TST”等

我很难弄明白为什么会这样。如果N=5,则palidrome(i-1)和palidrome(i-2)永远不会到达(i==0)或(i==1),因此理论上不应该返回任何内容


提前谢谢

让我们逐行讨论N=5时发生的情况

  • 回文(5)称为 -->我不是0或1 -->返回回文(3)+回文(4)+回文(3)的结果
  • 我们需要回文(3)的结果来构建回文(5)的结果。所以称回文(3)。 -->我不是0或1 -->返回回文(1)+回文(2)+回文(1)的结果
  • 我们需要回文(1)的结果来构建回文(3)的结果。所以称回文(1)。 -->i=1,因此返回“T”
  • 我们需要回文(2)的结果来构建回文(3)的结果。所以称回文(2)。 -->我不是0或1 -->返回回文(0)+回文(1)+回文(0)的结果
  • 我将在这里详细介绍递归,但是回文(2)的结果是“STS”
  • 这意味着我们得到回文(1)+回文(2)+回文(1)=回文(3)的“TSTST”
  • 这个结果返回到我们最初的回文(5)调用

  • 希望这有助于为您演示递归。

    让我们逐行讨论N=5的情况

  • 回文(5)称为 -->我不是0或1 -->返回回文(3)+回文(4)+回文(3)的结果
  • 我们需要回文(3)的结果来构建回文(5)的结果。所以称回文(3)。 -->我不是0或1 -->返回回文(1)+回文(2)+回文(1)的结果
  • 我们需要回文(1)的结果来构建回文(3)的结果。所以称回文(1)。 -->i=1,因此返回“T”
  • 我们需要回文(2)的结果来构建回文(3)的结果。所以称回文(2)。 -->我不是0或1 -->返回回文(0)+回文(1)+回文(0)的结果
  • 我将在这里详细介绍递归,但是回文(2)的结果是“STS”
  • 这意味着我们得到回文(1)+回文(2)+回文(1)=回文(3)的“TSTST”
  • 这个结果返回到我们最初的回文(5)调用

  • 希望这有助于为您演示递归。

    palidrome
    的每次连续递归调用都会使您更接近基本情况,如下所示:

    if (i == 0) return "S";
    if (i == 1) return "T";
    
    从理论上说

    回传道(i-1)和回传道(i-2)永远不会达到(i==0)或(i== (一)

    是错误的,因为最终将达到这些语句,但在
    i
    更改以满足条件之后

    var
    i
    将如何改变你可能想知道的!通过这句话:

    return palidrome(i-2) 
                + palidrome(i-1)
                + palidrome(i-2);
    
    在这里,您递归地调用
    palidrome
    ,但是(
    i
    减少),这将最终导致基本情况

    如果你的函数从来没有碰到过
    基本情况
    ,那么你将有一个无限递归,而这里的情况并非如此


    为了简化事情,让我们看看这个例子:

    假设你有一个慷慨的邻居,如果你拜访他一次,他会给你一个苹果,如果你拜访他两次,他也会给你一个苹果,然后他会开始给你和他上次给你的一样多的苹果(这实际上是一个
    fibonacci
    序列),因此一般情况如下:
    numberofapplesthattyouget=numberofapplesthattyou'veGotIn(当前访问编号-1(这是最后一次访问))+numberofapplesthattyou'veGotIn(当前访问编号-2)

    让我们假设
    currentVisitNumber=n和numberOfApplesThatYouGet=fib方法

    所以一般规则是-->

    但是我们仍然需要一个
    基本情况
    来终止无限递归,这里基本情况是您的第一个访问条件,它是

    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
    


    另外,请看一下这一点,以便更好地理解。

    回文
    的每次连续递归调用都会使您更接近基本情况,如下所示:

    if (i == 0) return "S";
    if (i == 1) return "T";
    
    从理论上说

    回传道(i-1)和回传道(i-2)永远不会达到(i==0)或(i== (一)

    是错误的,因为最终将达到这些语句,但在
    i
    更改以满足条件之后

    var
    i
    将如何改变你可能想知道的!通过这句话:

    return palidrome(i-2) 
                + palidrome(i-1)
                + palidrome(i-2);
    
    在这里,您递归地调用
    palidrome
    ,但是(
    i
    减少),这将最终导致基本情况

    如果你的函数从来没有碰到过
    基本情况
    ,那么你将有一个无限递归,而这里的情况并非如此


    为了简化事情,让我们看看这个例子:

    假设你有一个慷慨的邻居,如果你拜访他一次,他会给你一个苹果,如果你拜访他两次,他也会给你一个苹果,然后他会开始给你和他上次给你的一样多的苹果(这实际上是一个
    fibonacci
    序列),因此一般情况如下:
    numberofapplesthattyouget=numberofapplesthattyou'veGotIn(当前访问编号-1(这是最后一次访问))+numberofapplesthattyou'veGotIn(当前访问编号-2)

    让我们假设
    currentVisitNumber=n和numberOfApplesThatYouGet=fib方法

    所以一般规则是-->

    但我们仍然需要一个
    基本案例