2014-10-28 3 views
-1

Реализовать функцию, которая принимает функцию в качестве своего первого аргумента, число num как второй аргумент, а затем выполняет переданное в функции num times.JavaScript Более высокий порядок Функция loop/recursion/confusion

function repeat(operation, num) { 
    var num_array = new Array(num); 
    for(var i = 0; i < num_array.length; i++){ 
    return operation(num); 
    } 
} 
// 
// The next lines are from a CLI, I did not make it. 
// 
// Do not remove the line below 
module.exports = repeat 

РЕЗУЛЬТАТЫ:

ACTUAL        EXPECTED 
------        -------- 
"Called function 1 times."   "Called function 1 times."  
""        != "Called function 2 times."  
null       != ""        
# FAIL 

Почему это не работает?

Я предполагаю, что я запускаю функцию, называемую repeat. Повтор имеет два параметра и принимает два аргумента.

Для цикла я создать массив, который имеет длину, которая равна NUM проходил в.

Я тогда начать цикл, установив переменную счетчика я в 0. Тогда я установил условный оператор, который гласит, что я всегда должен быть меньше длины num_array, которая была создана ранее. Затем счетчик i увеличивается на единицу с помощью ++.

Для каждого случая, когда условие является истинным, мы должны вернуть значение вызова, выполняющего операцию функции, и передать num в качестве аргумента.

Последние две строки позволяют легко запускать программу через командную строку с использованием предварительно запрограммированных аргументов.

Благодарим вас за внимание!

+0

Вам не нужно свой массив. Как вы проверили свою функцию? –

+0

Он автоматически тестируется с помощью CLI, который я использую. 'ACTUAL EXPECTED ------ -------- « Вызывается функция 1 раз ». «Вызывается функция 1 раз». ""! = "Вызывается функция 2 раза." null! = "" # FAIL' – kschmit90

+0

Добавьте к вашему сообщению фактические и ожидаемые результаты (используйте 'edit'). –

ответ

2

return заявление вспыхивают функции на первой итерации цикла. Вы должны удалить return, и просто вызвать функцию так:

function repeat(operation, num) { 
    for(var i = 0; i < num; i++){ 
    operation(num); 
    } 
} 

Обратите внимание, что я удалил создание и итерацию массива, вам не нужно это для того, что вы здесь делаете.

Кроме того, ваш первоначальный вопрос не уточняет, что вам нужно передать num функции (но вы перечислить его в ваших шагов ниже), так что вы можете быть в состоянии сделать только operation() вместо operation(num).

+0

А, да, это тоже имеет смысл. Благодаря! – kschmit90

0

Возможно, вы хотите что-то вроде ниже, а не return. В результате функции operation(num) вы хотите сохранить значение в массиве. return в цикле прорывается из цикла, так что всегда будет работать только один раз ..

function repeat(operation, num) { 
    var num_array = new Array(num); 
    for(var i = 0; i < num_array.length; i++){ 
    num_array[i] = operation(num); 
    } 
} 
// 
// The next lines are from a CLI, I did not make it. 
// 
// Do not remove the line below 
module.exports = repeat 
+0

Вот и все, спасибо! Это умный способ решить эту проблему. Это почти как функция .map. – kschmit90

0

Если вы спрашиваете, почему цикл не работает, это потому, что вы должны запустить функцию после ее определения (я предполагаю, что вы еще не вызываете функцию где-то еще).

После вызова функции repeat вы увидите, что она выйдет после одной итерации. Это происходит потому, что вы возвращаете операцию - возврат приводит к завершению функции. Чтобы остаться в цикле, вам просто нужно позвонить operation(), без return.

Также вам не нужно создавать массив, вы можете просто использовать счетчик, который вы определяете в цикле for.

Так что код будет выглядеть примерно так:

var op = function(arg) {console.log(arg);}, 
    n = 5; 

function repeat(operation, num) { 
    for(var i = 0; i < num; i++){ 
    operation(i); 
    } 
} 

repeat(op ,n); 

// The next lines are from a CLI, I did not make it. 
// 
// Do not remove the line below 
module.exports = repeat 
+0

ОП указывает, что аргументы передаются функции извне его кода. –