#java #recursion #stack #return-type #callstack
Вопрос:
Я заметил, что некоторые рекурсии имеют тип возвращаемого значения, но некоторые просто имеют тип возвращаемого значения void. Я не могу сказать, когда и что использовать. Я также заглянул в стек вызовов, и я предполагаю, что рекурсии с типом «void» просто возвращают значение, записанное в стеке. Я не знаю, правильно ли я понимаю. Я не могу преобразовать рекурсию с типом возврата void в рекурсию типа возврата. Например, я не знаю, как реализовать функцию Фибоначчи с типом возврата void.
private int fibonacci(int number) {
if (number < 1) {
return number;
}
return fibonacci(number-1) fibonacci(number-2);
}
Кроме того, в функции rec я исследовал стек вызовов; но я не могу сказать, как программа знает, когда нужно вставить запись в стек. В базовом случае функции rec программа отлично работает без » return;»; но я заметил, что она также работает с » return;». Я действительно не могу сказать, почему это так. Может кто-нибудь, пожалуйста, объяснить, как стек работает с рекурсией?
private static void rec(int l, int r, List<String> list,String s){
if(r==0){
list.add(s);
// return;
}
if(l>0){
rec(l-1,r,list,s "(");
}
if(r>l){
rec(l,r-1,list, s ")");
}
}
Комментарии:
1. Это не имеет ничего общего с рекурсией. Задайте себе один вопрос: должна ли моя функция возвращать какое-либо значение? Если да, то вы действительно возвращаете какое-то значение, в противном случае вы этого не делаете… Не усложняй ситуацию.
2. И вы кодируете «возврат» в функции void, когда хотите завершить выполнение этого экземпляра процедуры, не выполняя ее до конца текста процедуры. В примере «возврат» предотвращает выполнение случая «l>0». Имеет ли это значение для вашего кода? Только ты знаешь.
3. Почему ‘rec()` работает с вызовом и без
return;
него ?return;
Это сразу же завершило бы метод, в то время как без него условияl > 0
иr > l
все равно были бы оценены, и в этомr=0
случае они были бы оценены как ложные.4. Я понял. Спасибо за объяснение! Итак, могу ли я понять, что возврат запускает его для извлечения всей функции из стека?
5. Кроме того, если я хочу записать каждое число Фибоначчи последовательно, например [0,1,1,2,3,5], я думаю, что мне нужно записать возвращенный номер каждого вызова; но если я верну его, у меня не будет возможности записать его, так как результат будет возвращен напрямую. Если я не верну int, я не смогу добавить int в список ArrayList. Я не знаю, стоит ли мне возвращаться в этом случае. Есть ли способ извлечь значение из стека и поместить его в мой массив?