2015-05-04 2 views
0
var f_drum_min = function myself(a){ 
    alert(a); 
    $f_min_node.push(a); 
    for (i=0;i<=$m;i++){ 
     if ($f_leg[i][1]==a){ 
      myself($f_leg[i][0]); 
     } 
    } 
}; 

myself($f_leg[i][0]); Перерывы for петли, как я могу сделать его запустить несколько раз в цикле?Javascript рекурсивная функция внутри для цикла

+0

'var f_drum_min = function myself (a)' Не кажется законным. –

+1

@u_mulder: Фактически это действительный синтаксис JavaScript. Идентификатор 'сам' будет существовать только внутри * функции. –

+1

@RocketHazmat спасибо, теперь я знаю больше) –

ответ

4

Ваша функция пронизана вредными привычками

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

Причина, почему я звоню эти плохих привычек, потому что нет никакой возможности знать эффекта вашей функции. Это только вход 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 в целом.

+0

+1 Для решения этой проблемы. Я взглянул на нее и решил, что не стоит пытаться подробно описать все это, реквизит для вас для этого. –

+0

@ JaredSmith Я ценю отзывы ^.^Если бы я научился писать лучшие функции 10 лет назад, я задаюсь вопросом, где бы я был сегодня ... – naomik

1

Одна из основных проблем с кодом, которая могла бы привести к ее разрыву практически при любых обстоятельствах, состоит в том, что переменная цикла i является глобальной и, таким образом, разделяется всеми рекурсивными вызовами функции.

Например, предположим, что функция вызывается в первый раз. i - 0.Теперь он повторяется, и предположим, что условие в if никогда не true. В конце второго звонка i = $m + 1. Когда вы вернетесь к первому вызову, потому что i является глобальным, цикл в первом вызове заканчивается. Я предполагаю, что это не то, что вы хотите.

Исправление это объявить i как местные:

for (var i=0;i<=$m;i++){ 

Это может или не может решить все ваши проблемы (как указано в комментариях, мы должны были бы увидеть больше вашего кода определить все возможные проблемы), но это критический первый шаг.

+0

чувак да спасибо, ты не можешь поверить, что я пропустил это – Karl

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