Ваша функция пронизана вредными привычками
Там нет никакого способа для меня, чтобы помочь улучшить эти функцию, потому что я понятия не имею, что все эти внешние государства делают. Также не сразу видно, каковы они типы данных.
Причина, почему я звоню эти плохих привычек, потому что нет никакой возможности знать эффекта вашей функции. Это только вход a
, но функция зависит от $f_min_node
, $f_leg
и $m
.
Какова ценность этих переменных во время вызова вашей функции?
Какие другие функции меняют эти значения?
Я назначил $f_min_node
на некоторое значение, а затем вызвал f_drum_min
. Как я должен был знать, что $f_min_node
будет изменен?
Каждый раз, когда вы вызываете свою функцию, это большой сюрприз, что происходит в результате. Это проблемы написания недетерминированных («нечистых») функций.
Пока вы не можете устранить эти проблемы, рекурсии в наличии для автоматического повтора мере ваши проблемы
Я аннотированный код с комментариями здесь
// bad function naming. what??
var f_drum_min = function myself(a){
// side effect
alert(a);
// external state: $f_min_node
// mutation: $f_min_node
$f_min_node.push(a);
// leaked global: i
// external state: $m
for (i=0;i<=$m;i++){
// external state: $f_leg
// loose equality operator: ==
if ($f_leg[i][1]==a){
myself($f_leg[i][0]);
}
}
};
Я могу помочь вам написать детерминированную рекурсивную функцию, которая использует линейный итеративный процесс. Самое главное, что это не зависит от какого-либо внешнего состояния и никогда не мутирует вход.
// Number -> Number
var fibonacci = function(n) {
function iter(i, a, b) {
if (i === 0)
return a;
else
return iter(i-1, b, a+b);
}
return iter(n, 0, 1);
}
fibonacci(6); // 8
for
Петли довольно примитивные; Императивные программисты достигнут этого почти сразу, думая, что это единственный способ решить итерационную проблему.
Я мог бы использовал for
цикл в этой функции, но думать о проблеме по-другому позволяет мне выразить это по-другому, и избежать петли for
в целом.
'var f_drum_min = function myself (a)' Не кажется законным. –
@u_mulder: Фактически это действительный синтаксис JavaScript. Идентификатор 'сам' будет существовать только внутри * функции. –
@RocketHazmat спасибо, теперь я знаю больше) –