Другой результат для -l oop, while-l oop и рекурсивного метода в одном файле? - PullRequest
0 голосов
/ 14 июля 2020

Я вычислил ряд Фибоначчи для l oop, а l oop и рекурсивным методом. Я рассчитал эти 3 способа в одном файле. Получил результат для l oop и при l oop как обычно. Но когда я добавил коды рекурсивного метода, я получил следующий результат:

Коды:

// Calulating fibonacci series using for loop
function fibonacci(n) {
    var fibo = [0, 1];
    for (var i = 2; i <= n; i++) {
        fibo[i] = fibo[i - 1] + fibo[i - 2];
    }
    return (fibo);
}
var result = fibonacci(7);
console.log(result)

// Calculating fibonacci series using while loop
function fibonacci(n) {
    var fibo = [0, 1];
    var i = 2;
    while (i <= n) {
        fibo[i] = fibo[i - 1] + fibo[i - 2];
        i++;
    }
    return fibo;
}
var result = fibonacci(7);
console.log(result);

// Calculating fibonacci series in a recursive way
function fibonacci(n) {
    if (n == 0) {
        return 0;
    }
    if (n == 1) {
        return 1;
    } else {
        return fibonacci(n - 1) + fibonacci(n - 2);
    }
}
var result = fibonacci(7);
console.log(result);

Результат:

$ node fibonacci.js
13
13
13

см. Результат моего рекурсивного метода отображается также для l oop и для l oop. Когда я закомментировал коды рекурсивных методов, результат показал:

$ node fibonacci.js
[
  0, 1, 1,  2,
  3, 5, 8, 13 
]
[
  0, 1, 1,  2,
  3, 5, 8, 13
]

, как и ожидалось. Почему это происходит??? Это кажется загадочным, поскольку у меня недостаточно знаний о рекурсии.

Ответы [ 2 ]

0 голосов
/ 14 июля 2020

Все они используют одно и то же имя «fibonacci» и заменяют определение fibonacci. Выполняется только последнее объявление функции. Используйте разные имена. (Объявления функций получают поднятые вместе с их определениями.)

Из-за поднятия код OP эквивалентен:

var fibonacci = function fibonacci(n) { ...(forloop) }
var fibonacci = function fibonacci(n) { ...(while) }
var fibonacci = function fibonacci(n) { ...(recursive) }

var result = fibonacci(7);
console.log(result);

var result = fibonacci(7);
console.log(result);

var result = fibonacci(7);
console.log(result);

Просто переименуйте их, чтобы они не ' т конфликт. Также добавлена ​​рекурсивная реализация fib4, которая возвращает массив значений фибоначчи.

// Calulating fibonacci series using for loop
function fibonacci1(n) {
    var fibo = [0, 1];
    for (var i = 2; i <= n; i++) {
        fibo[i] = fibo[i - 1] + fibo[i - 2];
    }
    return (fibo);
}
var result = fibonacci1(7);
console.log(result)

// Calculating fibonacci series using while loop
function fibonacci2(n) {
    var fibo = [0, 1];
    var i = 2;
    while (i <= n) {
        fibo[i] = fibo[i - 1] + fibo[i - 2];
        i++;
    }
    return fibo;
}
var result = fibonacci2(7);
console.log(result);

// Calculating fibonacci series in a recursive way
function fibonacci3(n) {
    if (n == 0) {
        return 0;
    }
    if (n == 1) {
        return 1;
    } else {
        return fibonacci3(n - 1) + fibonacci3(n - 2);
    }
}
var result = fibonacci3(7);
console.log(result);

// recursive with cache table 2nd parameter, returns cache table
const fib4 = (n, fib=[0,1]) => {
  fib[n] = fib[n] ?? (fib4(n-1, fib)[n-1] + fib4(n-2, fib)[n-2])
  return fib
}
var result = fib4(7);
console.log(result);

Артикул МДН по подъему

0 голосов
/ 14 июля 2020
function fibonacci(n) {
    var fibo = [0, 1];
    for (var i = 2; i <= n; i++) {
        fibo[i] = fibo[i - 1] + fibo[i - 2];
    }
    return fibo[fibo.length - 1];
}
var result = fibonacci(7);
console.log(result)

Если вы запустите этот пример в chrome dev tools , вы увидите, что результатом всегда будет массив. Поскольку для l oop вы заполняете массив, нет ничего плохого в рекурсивном методе.

fibo[i] вы каждый раз добавляете в массив новые элементы. Попробуйте использовать fibo[fibo.length - 1], и вы получите последний элемент вашего вычисления

То же самое с while l oop. Вы заполняете массив. Если ваша цель получить последнее значение, а не весь список вычислений, ваш рекурсивный вариант является единственно правильным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...