使用arguments属性的递归Javascript函数给出了正确的答案,但返回undefined
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用arguments属性的递归Javascript函数给出了正确的答案,但返回undefined相关的知识,希望对你有一定的参考价值。
我正在构建一个代数计算器,我正在研究递归函数来从多项式中过滤类似的项。下面的函数的作用是它产生所需的类似术语数组。我可以通过向函数添加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
}
答案
工作更聪明,而不是更难
尽量不要用不必要的变量,赋值或逻辑条件来伤害你的头 - 一个简单的递归函数和简单的相等测试
const eq = x => y =>
x === y
const neq = x => y =>
x !== y
const filterLikeTerms = ([ x, ...xs ]) =>
x === undefined
? []
: [ xs.filter (eq (x)) ]
.concat (filterLikeTerms (xs.filter (neq (x))))
const data =
['a', 'b', 'c', 'd', 'a', 'b', 'c', 'd', 'a', 'a', 'b']
console.log (filterLikeTerms (data))
// [ [ a, a, a ]
// , [ b, b ]
// , [ c ]
// , [ d ]
// ]
另一答案
在ES6中:
const filterLikeTerms=terms=>[...(new Set(terms))]
以上是关于使用arguments属性的递归Javascript函数给出了正确的答案,但返回undefined的主要内容,如果未能解决你的问题,请参考以下文章
使用arguments属性的递归Javascript函数给出了正确的答案,但返回undefined
arguments.callee Function.callee arguments.caller总结
在JavaScript中,arguments是对象的一个特殊属性。