【发布时间】:2018-06-10 21:52:46
【问题描述】:
我正在构建一个代数计算器,并且正在研究一个递归函数来过滤多项式中的类似项。下面的函数的工作原理是它产生所需的类似术语的数组。我可以通过向函数添加一个 console.log 语句来验证这一点。但是,由于某种原因,该函数不会返回输出。它返回“未定义”。
我的想法是递归调用链应该以如下所示的结束条件终止,然后将返回的参数 [1] 数组通过堆栈传递。
我在这里读到过类似的问题,人们忘记在一个或多个地方放置退货声明。但是,在我的代码中,我有一个带有结束条件和递归函数调用的 return 语句。这可能是我缺少的一些简单的东西。
var filterLikeTerms = function (terms) { //takes an array of terms, optional second argument is an array of arrays of similar terms
if (!arguments[1]) arguments[1] = []; //Initilizes the second argument if none is given
if (terms.length == 0) return arguments[1]; //End condition
arguments[1].push(terms.filter(term => terms[0].toString() === term.toString())); //Adds similar terms to the 2nd argument array
terms = terms.filter (term => terms[0].toString() !== term.toString()); //shortens the terms array to exclude the like terms filtered above
return filterLikeTerms(terms, arguments[1]); //recursive function call
}
【问题讨论】:
-
张贴你打电话给
filterLikeTerms的东西?您在必须作为字符串传入的属性上调用.toString。您不能将7x + 1作为值传入。它已经是一个字符串。第二个注意事项,似乎代码试图变得聪明。退后一步,让遍历变得简单,然后再进行优化。 -
也许我不明白这个问题,但是当我输入
console.log(filterLikeTerms(['A', 'B', 'C', 'D']))时,它会打印数组数组而不是未定义的...... -
您不能将参数
arguments传递给该方法,因为它只接受一个参数:terms。我认为您需要使该方法接受2个参数filterLikeTerms(terms, arguments)。该过程的示例可以使您的问题更容易理解,例如示例输入和预期输出。 -
@Eaton 非箭头函数支持通过访问函数内可用的
arguments对象,使用可变数量的参数调用,不一定声明为形式参数。不建议声明名为arguments的参数!
标签: javascript recursion return arguments