首页 > 解决方案 > 递归 Javascript 函数中的范围问题

问题描述

我有一个递归函数(执行堆算法来生成排列)。它似乎有一个可变范围问题。

function permute(starting_arr) {
  var all_permutations = [];
  heap(starting_arr, starting_arr.length-1);
  console.log(all_permutations);
  return all_permutations;

  function heap(a, n) {  // a = array, n = max index i.e. length -1
    var temp_an;

    if (a.length-1 == n) {
      all_permutations.push(a); 
    }

    if (n>1) {
      heap(a.slice(), n-1);
    }

    for ( var i=0; i<n ; i++ ) {
      temp_an = a[n];
      if (n%2==0) {
        a[n] = a[0]
        a[0] = temp_an;
      } else {
        a[n] = a[i]
        a[i] = temp_an; 
      }

      all_permutations.push(a); 

      if (n>1) { heap(a.slice(), n-1); }   
    }
  }
}

似乎问题出在“all_permutations.push(a)”上,因为如果我将其替换为 ...

 all_permutations.push([]); 
 for ( var g=0 ; g<a.length ; g++ ) {
   all_permutations[all_permutations.length-1][g] = a[g];
 }

正如您所看到的,我正在尝试使用 slice,我已经读过它作为一种解决方案,允许您通过值而不是引用传递数组,例如在这个...

function x(arr){
  arr.push(4);
}

var a = [1,2,3]
x(a);
console.log(a);
var b = [1,2,3]
x(b.slice());
console.log(b);

这确实有些作用,但它仍然无法正常工作。

谢谢你的帮助。

标签: javascriptrecursionscope

解决方案


如您所见,我正在尝试使用 slice,我已经阅读过它作为一种解决方案,允许您通过值而不是引用传递数组

是的,您发现了问题以及解决问题的正确方法。但是,您需要将其专门应用于该行

all_permutations.push(a);

在你的for循环中:

all_permutations.push(a.slice());

推荐阅读