2016-07-02 3 views
0

Попытка изучения javascript и обратных вызовов. Что мне здесь не хватает? EDITEDПоследовательность Fibonnaci с обратным вызовом в Javascript

var fibNumber = function(n, callback) 
{ 
    if (n < 2){ 
    return 1; 
    }else{ 
    return function(n-2) + function(n-1); 
    } 
    callback(n) 
} 
var n = console.log(prompt("An integer please: "); 
fibNumber(n, function(n) 
{ 
    console.log(n) 
}); 
+1

Вы никогда не вызываете обратный вызов – flup

+0

Хорошо, я бы заменил первый: console.log (result); с обратный вызов (результат); ? –

+0

Что вы думаете, 'a, b = b, a + b;' делает? Вы имели в виду '[a, b] = [b, a + b];'? Кроме того, кажется немного странным передавать эти числа в качестве аргументов - я ожидаю, что, возможно, один аргумент, 'n', это означает« дайте мне * n * th число Фибоначчи ». Какова ваша функция на самом деле? – nnnnnn

ответ

0

не в состоянии понять, что вы пытаетесь достичь путем передачи значений х и у.

Если вы хотите напечатать серию фибоначчи для первых N номеров, я написал этот код.

var fibNumbers = function(n, callback){ 

    var series = []; 

    var temp; 

    for (var i = 0; i <= n; i++){ 

     if(i == 0 || i == 1){ 

      temp = 1; 

     }else{ 

      temp = series[i-1] + series[i-2]; 

     } 


     series.push(temp); 

    } 

    callback(series); //calling the callback here with argument series array containing the series 

} 

fibNumbers(30, function(result){ 

    console.log(result); //will console log the series 

}); 
+0

Ваши усилия хороши, но только один раз хорошо работает. если вы повторите, вы получите что-то неактуальное. –

+0

Не могли бы вы рассказать? @mortezaT –

+0

Назовите его еще раз тем же номером, показывая ошибку. Вы выталкиваете каждое значение в массив без проверки того, существует ли это. –

0

Что изменилось:

  • Названная функция fibNumber - нет необходимости.
  • fibNumber работает как закрытие для callback
  • Названные функции f. Функция начала для вычисления числа фибоначчи.
  • Эта функция вызывается, а затем возвращается. Часть, где начинается рекурсия.
  • Внутри f выдается чек и вызывается callback. Тогда вызов ригера f (function не является именем для функции) выполнен с n - 2 и n - 1. результат перенастраивается.
  • Вы пытаетесь вернуть результат console.log вместо prompt. Это не работает. Разделите две части по два и присвойте числовое значение n. Затем сделайте вывод.
  • Позвоните по номеру fibNumber с обратным вызовом и выведите результат.

function fibNumber(n, callback) { 
 
    function f(n) { 
 
     if (n < 2) { 
 
      return 1; 
 
     } else { 
 
      callback(n); 
 
      return f(n - 2) + f(n - 1); 
 
     } 
 
    } 
 
    return f(n); 
 
} 
 
var n = +prompt("An integer please: "); 
 

 
console.log(n); 
 
console.log(fibNumber(n, function (n) { console.log(n); }));

0

Некоторые вопросы:

  • Как всегда выполнить return заявление до достижения зову callback, что никогда не будет выполнена. Итак, не возвращайте, но сохраните результат в переменной, затем вызовите callback и затем верните это значение.
  • Вызов function неправильный синтаксис, вместо этого вы должны позвонить fibNumber.
  • Когда вы вызываете fibNumber рекурсивно, вы не предоставляете аргумент callback. Это нормально, но затем вы должны проверить, получили ли вы этот аргумент перед отправкой callback. В противном случае вы получите сообщение об ошибке undefined.
  • У вас есть отсутствующая закрывающая скобка в инструкции, в которой вы запрашиваете ввод.
  • console.log(prompt(...)) не возвращает входное значение, по крайней мере, во всех браузерах. Выполните console.log(n) отдельно.
  • Вы не преобразовываете входные данные в число: вход, полученный через prompt, всегда является строкой. Без этого преобразования сравнение n < 2 в функции никогда не будет истинным, и поэтому вы попадете в бесконечную рекурсию.Передайте вход в номер с помощью унитарного оператора +.
  • Не проблема, но смущает, что в вашем основном коде вы используете n как для ввода, так и для вывода. Для этого лучше использовать другое имя переменной.

Здесь исправлен код:

var fibNumber = function(n, callback) 
 
{ 
 
    var result; // for temporary storage of value to be returned 
 
    if (n < 2){ 
 
    result = 1; 
 
    }else{ 
 
    // You cannot call "function", you need to call "fibNumber" 
 
    result = fibNumber(n-2) + fibNumber(n-1); 
 
    } 
 
    // Only call callback when it was provided 
 
    if (callback) callback(result); 
 
    // also return it: 
 
    return result; 
 
} 
 
var n = +prompt("An integer please: "); // cast input to number 
 
console.log('input: ', n); // don't use console.log to get `n`. 
 
fibNumber(n, function(result) // use different name 
 
{ 
 
    console.log('result: ', result) 
 
});

1

Если вы хотите обратного вызова будет вызвана после окончательного расчета и получить ряд фибо до этого числа, то это будет один из ваши пути пойти:

function fibo(n, callWithSeries) { 
 
    fibo.series = fibo.series || [1]; 
 

 
    fibo.f(n); 
 
    callWithSeries(fibo.series.slice(0, n + 1)); 
 
    return fibo.series[n]; 
 
} 
 

 
fibo.f = function(n) { 
 
    if (fibo.series[n]) 
 
    return fibo.series[n]; 
 
    if (n < 2) 
 
    return (fibo.series[n] = 1); 
 
    return (fibo.series[n] = fibo.f(n - 1) + fibo.f(n - 2)); 
 
}; 
 

 
var res = fibo(6, s => console.log(s)); 
 
console.log('result: ', res); 
 

 
res = fibo(2, s => console.log(s)); 
 
console.log('result: ', res);

+0

Существует некоторая проблема с логикой, ваш код не дает желаемого результата. –

+0

Я изменил его без проверки. Проверьте это сейчас. –

+0

Кроме того, я ничего не понял. Вы сказали, что нет необходимости рассчитывать серию каждый раз. Даже в вашем коде он вычисляется при каждом вызове функции (снова выполняет весь процесс). Будет здорово, если вы сможете это уточнить? –

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