2014-12-15 2 views
2

Я новичок в совете, и я извиняюсь за то, что оторвался как полный нуб, я просто пытаюсь обмотать логику этого рекурсивного метода. Я также искал совет по этому вопросу уже и нашел что-то подобное, но не ответил на мой вопрос ..понимание логики в этом рекурсивном вызове

public int bunnyEars(int bunnies) { 

    if(bunnies == 0) return 0; 

    return 2 + bunnyEars(bunnies - 1); 
} 

Я знаю, что это компилируется и работает. Но я неясен с рекурсивным вызовом, где 1 вычитается из числа проходящих мимо кроликов. Точнее, как можно передать число 1 в качестве аргумента bunnyEars (1) и все равно получить правильный ответ 2 без вычитается и приравнивается к 0, таким образом выходя из метода.

ответ

0

если аргумент является 1 в функции вы получите

возвращаемые 2 + bunnyEars (1 - 1); который cals bummyEars (0) и возвращает 0 , чтобы вы получили возврат 2 + 0; и ваш выход равен 2.

простой рекурсия.

1

Попробуйте расширить цепочку вызовов. Например, если вы вызываете bunnyEars(1), то return оператор вычисляет:

2 + bunnyEars(1 - 1) 
= 2 + bunnyEars(0) 
= 2 + 0 
= 2 

Аналогично, для bunnyEars(2):

2 + bunnyEars(2 - 1) 
= 2 + bunnyEars(1) 
= 2 + 2 + bunnyEars(1 - 1) 
= 2 + 2 + bunnyEars(0) 
= 2 + 2 + 0 
= 4 
0

Причина рекурсия работает, когда число 1 передается, чтобы это происходит потому, что вы возвращаете

2 + bunnyEars(bunnies - 1) 

, даже если количество зайчиков равно 0. Обернув второе возвращение в другое условие, вы будете получить ожидаемый результат от 0, возвращаемого при переходе в bunnyEars (1).

Как так:

public int bunnyEars(int bunnies) { 
    if(bunnies == 0) { 
     return 0; 
    } else { 
     return 2 + bunnyEars(bunnies - 1); 
    } 
} 
+0

имеет полный смысл, когда я смотрю на это с утверждением другого. – user3646508

Смежные вопросы