Как работает стек вызовов с рекурсией с типом возврата или без него?

#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. Я не знаю, стоит ли мне возвращаться в этом случае. Есть ли способ извлечь значение из стека и поместить его в мой массив?