Рекурсия и условная путаница - PullRequest
0 голосов
/ 11 ноября 2018

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

Я знаю, что этот код проходит через условные выражения в else и уменьшает значение b, пока не достигнет условного значения else, если выполняется условие b == 1.

Чего я не понимаю, так это как в том случае, если значение b увеличивается и с тех пор увеличивается, так же как и значение 'a', пока не будет достигнуто окончательное значение 33.

Другая странная особенность этого кода состоит в том, что после внесения этих изменений else else запускается только else, и другие условия больше не проверяются.

Для кого-то относительно новичка в рекурсии это поведение действительно странно.

function mlt(a, b) {

        debugger;

        if(!(a && b)) {
            return 0;
        } else if (b == 1) {
            return a;
        } else {
            return (a + mlt(a, b - 1));
        }
    }

    console.log(mlt(3, 11));

Копирование этого в консоль браузера и прохождение циклов даст представление о том, о чем я.

1 Ответ

0 голосов
/ 11 ноября 2018

Это не пример закрытия, а рекурсии.

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

Давайте возьмем для примера этот основной вызов:

mlt(20, 4)

Выполнение перейдет к части else и выполнит рекурсивный вызов:

return (a + mlt(a, b - 1));

Как вы можете получить, рекурсивный вызов сводится к mlt(20, 3). Теперь давайте на мгновение предположим, что этот рекурсивный вызов возвращает правильный результат, то есть 60. Посмотрите, что происходит в приведенном выше выражении:

return (20 + 60);

Это 80, что действительно является правильным результатом для нашего первоначального вызова mlt(20, 4). Таким образом, мы можем получить представление о том, как эта функция будет возвращать правильный продукт для любого заданного b, если предположить, что функция делает это правильно и для b-1.

Что происходит, когда b = 1? Затем функция возвращает a. Мы также видим, что это правильно. Так что с предыдущим выводом мы теперь можем быть уверены, что если b >= 1, результат будет правильным.

Обратите внимание, что функция также будет делать это правильно для b = 0, после чего начнется первый if. Также обратите внимание, что эта функция не хорошо справляется с отрицательными значениями b: in в этом случае функция будет повторяться с b-1 и в конечном итоге столкнется с ошибкой емкости стека.

...