How does the recursion here work?

后端 未结 9 1136
悲&欢浪女
悲&欢浪女 2021-01-04 12:18

Code 1:

public static int fibonacci (int n){ 
    if (n == 0 || n == 1) { 
        return 1; 
    } else { 
        return fibonacci (n-1) + fibonacci (n-2)         


        
9条回答
  •  借酒劲吻你
    2021-01-04 12:48

    In the case of code 2 though n will eventualy reach a point at which it doesnt satisfy n>0 and the method will stop calling itself recursivly

    to make it look similar you can replace condition if (n == 0 || n == 1) with if (n < 2)

    Also i don't see how the line `return fibonacci (n-1) + fibonacci (n-2) would work since fibbonacci n-2 has to contain in some sense fibonacci n-1 in order to wrok but it isn't there yet.

    I suspect you wanted to write: "since fibbonacci n-1 has to contain in some sense fibonacci n-2"
    If I'm right, then you will see from the example below, that actually fibonacci (n-2) will be called twice for every recursion level (fibonacci(1) in the example):
    1. when executing fibonacci (n-2) on the current step
    2. when executing fibonacci ((n-1)-1) on the next step

    (Also take a closer look at the Spike's comment)

    Suppose you call fibonacci(3), then call stack for fibonacci will be like this:
    (Veer provided more detailed explanation)

    n=3. fibonacci(3)  
    n=3. fibonacci(2) // call to fibonacci(n-1)
       n=2. fibonacci(1) // call to fibonacci(n-1)
          n=1. returns 1
       n=2. fibonacci(0) // call to fibonacci(n-2)
          n=0. returns 1
       n=2. add up, returns 2
    n=3. fibonacci(1) //call to fibonacci(n-2)
       n=1. returns 1
    n=3. add up, returns 2 + 1
    

    Note, that adding up in fibonacci(n) takes place only after all functions for smaller args return (i.e. fibonacci(n-1), fibonacci(n-2)... fibonacci(2), fibonacci(1), fibonacci(0))

    To see what is going on with call stack for bigger numbers you could run this code.

    public static String doIndent( int tabCount ){
        String one_tab = new String("   ");
        String result = new String("");
        for( int i=0; i < tabCount; ++i )
           result += one_tab;
        return result;
    }
    
    public static int fibonacci( int n, int recursion_level )
    {
        String prefix = doIndent(recursion_level) + "n=" + n + ". ";
    
        if (n == 0 || n == 1){
            System.out.println( prefix + "bottommost level, returning 1" );
            return 1;
        }
        else{
            System.out.println( prefix + "left fibonacci(" + (n-1) + ")" );
            int n_1 = fibonacci( n-1, recursion_level + 1 );
    
            System.out.println( prefix + "right fibonacci(" + (n-2) + ")" );
            int n_2 = fibonacci( n-2, recursion_level + 1 );
    
            System.out.println( prefix + "returning " + (n_1 + n_2) );
            return n_1 + n_2;
        }
    }
    
    public static void main( String[] args )
    {
        fibonacci(5, 0);
    }
    

提交回复
热议问题