【问题标题】:My function doesn't return anything我的函数没有返回任何东西
【发布时间】:2016-07-09 01:53:09
【问题描述】:

我在堆函数中插入了一个字符串数组。尽管function generate() 可以正确打印输出console.log(permut);,但它不会返回任何数据。

版本 1 与 return arr

  var arrStr = ['a', 'a', 'b'];
  var generated = generate(arrStr, arrStr.length);
  console.log(g2);


  function generate(arr, n) {
    if (n === 1) {
      console.log(arr);
      return arr;
    } else {
      for (var i = 0; i < n; i++) {
        generate(arr, n - 1);
        if (n % 2 === 0) {
          swap(i, n-1, arr);
        } else {
          swap(0, n-1, arr);
        }
      }
    }
  }

  function swap(a, b, ar) {
    var temp = ar[b];
    ar[b] = ar[a];
    ar[a] = temp;
  }

带有permut = permut.concat(arr);的版本2

  var arrStr = ['a', 'a', 'b'];
  var generated = [];
  generate(arrStr, arrStr.length, generated);
  console.log(generated);


  function generate(arr, n, permut) {
    if (n === 1) {
      permut = permut.concat(arr);
      //console.log(permut);
    } else {
      for (var i = 0; i < n; i++) {
        generate(arr, n - 1, permut);
        if (n % 2 === 0) {
          swap(i, n-1, arr);
        } else {
          swap(0, n-1, arr);
        }
      }
    }
  }

  function swap(a, b, ar) {
    var temp = ar[b];
    ar[b] = ar[a];
    ar[a] = temp;
  }

版本 1 为变量 generated 返回 undefined,版本 2 返回一个空数组。

我尝试返回一个测试字符串 'asd' 但仍然没有得到任何东西。

【问题讨论】:

  • 你递归地调用函数,但是你对递归调用的结果做了什么?在else 路径中,您实际上返回了什么?
  • 功能正常。在else 路径中,n 被减少,直到执行有问题的返回的n===1
  • 在您显示的代码中,如果n !== 1(即在else 部分中)您没有return 语句。 IE。该函数不返回任何内容。如果要返回值,实际上必须使用return 语句。 if ... else 是二进制的,因为它要么 做某事(如果条件为真)或者它做其他事情。在您的函数中,something else 部分由第一次初始调用执行,它不返回任何内容。我建议你在调试器中单步调试代码。
  • 谢谢,我刚开始使用Mozilla的调试器。

标签: javascript arrays algorithm permutation


【解决方案1】:

在 JavaScript 函数中声明的变量会成为函数的本地变量。看看 Javascript 作用域。换句话说,您对函数内部的函数参数所做的更改不会影响函数外部的参数变量。

只需在算法结束时返回生成的对象。

例子:

var n = 1;
incrementByOne(n);
console.log(n) //still 1

function incrementByOne(number) {
    number++;
}

解决方法是返回结果并用变量获取:

var n = 1;
n = incrementByOne(n);
console.log(n) //now it's 2

function incrementByOne(number) {
    return number++;
}

【讨论】:

  • 我想这就是我在var generated = generate(arrStr, arrStr.length);所做的事情
  • 你想用算法做什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-11
  • 2012-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-10
  • 2020-05-17
相关资源
最近更新 更多