2011-12-26 2 views
1

Я сделал этот простой алгоритм, но Chrome действует странно, почти как функции, которые рекурсивно не возвращаются ... Задача алгоритма состоит в том, чтобы циклически использовать все возможности массива rs, который имеет три элемента, которые могут быть либо 0, либо 1.Почему этот рекурсивный алгоритм в JS не работает?

//rs is the list of all variables that can be 0 or 1 
//cS, or currentStack is the variable that s 

rs = [0, 0, 0]; 

circ = function(cS) 
{ 
    for (pos = 0; pos <= 1; pos ++) 
    { 
      rs[cS] = pos; 
      if (cS + 1 < rs.length) 
       circ(cS + 1); 
    } 
    return 0;      
} 

circ(0); //this should cycle trough all the possibilities of the rs array, it should look like this: 
/* 
000 - first element of rs, not last, so continue to the next 
000 - second element of rs, not last, so continue to the next 
000 - third element of rs, last, so continue with the for loop 
001 - the for loop ends, return to the second element 
011 - second element of rs, not last, so continue to the next 
010 - third element of rs, last, so continue with the for loop 
011 - the for loop ends, return to the first element 
111 - first element of rs, not last, so continue to the next 
101 - second element of rs, not last, so continue to the next 
100 - third element of rs, last, so continue with the for loop 
101 - the for loop ends, return to the second element 
111 - second element of rs, not last, so continue to the next 
110 - third element of rs, last, so continue with the for loop 
111 - the for loop ends, return to the second element 
111 - the for loop ends, return to the first element 
111 - return 
*/ 

Однако, это просто выглядит следующим образом:

000 
000 
000 
001 
return 

Может кто-нибудь сказать мне, почему это происходит? Что я сделал не так?

+0

Что вы хотите в итоге? Вы каждый раз переписываете элементы 'rs'. – pimvdb

+0

Возможный дубликат [JavaScript рекурсивного создания элемента не удается] (http://stackoverflow.com/questions/5333572/javascript-recursive-element-creation-fails) – outis

+0

Это кажется странным способом циклического использования возможных комбинаций: wouldn ' t вложенная петля делает трюк гораздо более читабельным способом? Даже желаемый результат в комментарии в конце вашего кода кажется немного странным, потому что у вас много повторяющихся значений. Почему ваша функция возвращает 0, когда вы вообще не используете возврат? – nnnnnn

ответ

6

Вы забыли объявить «pos» с var.

var circ = function(cS) 
{ 
    for (var pos = 0; pos <= 1; pos ++) 
    { 
      rs[cS] = pos; 
      if (cS + 1 < rs.length) 
       circ(cS + 1); 
    } 
    return 0;      
} 

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

Я не могу гарантировать, что это единственная проблема здесь. Например, в написанной функции он может перебирать все перестановки, но не отображает их и не копирует в любом месте, поэтому конечный результат будет равен [1, 1, 1].

+0

Спасибо за ответ! У меня были предыдущие трудности с глобальным охватом, а не с объявлением переменных с ключевым словом var ... Должен ли я выполнять функцию (var cS)? Как будто на C++, где вы должны инициализировать аргумент funtion. О да, и это просто упрощенная версия, в самом деле, которую я делаю с этими перестановками, и это не только цифры 0 и 1, но и другие номера. – corazza

+1

Нет, JavaScript не требует ключевых слов для параметров. Если вы только начинаете с JS, хорошее введение - бесплатная книга. Красноречивый JavaScript: http://eloquentjavascript.net/ – juandopazo

+1

Параметры @bane всегда * как локальные переменные (хотя в некоторых тайных способах они не точно * как локальные переменные). – Pointy

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