我正在构建一个代数计算器,我正在研究递归函数来从多项式中过滤类似的项。下面的函数的作用是它产生所需的类似术语数组。我可以通过向函数添加console.log语句来验证这一点。但是,由于某种原因,该函数不会返回输出。它返回“未定义”。
我的想法是,递归调用链应该以下面指出的结束条件终止,然后将返回的参数[1]数组传递给堆栈。
我在这里读过类似的问题,这个人忘记在一个或多个地方寄回报。但是,在我的代码中,我有一个带有结束条件和递归函数调用的return语句。这可能是我想念的简单事情。
JS
答案 0 :(得分:0)
更聪明,更努力
尽量不要用不必要的变量,赋值或逻辑条件伤害你的头脑 - 一个简单的相等测试的简单递归函数
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 ]
// ]

灵活实施
如果您想要更改项目的比较和分组方式,请更改eq
和neq
// for example ...
const eq = x => y =>
x.toString() === y.toString()
const neq = x => y =>
x.toString() !== y.toString()
如果您想像在原始代码中那样使用累加器参数,那也很好 - 对于非常大的输入,可以轻松地为stack-safe创建此表单
const filterLikeTerms = ([ x, ...xs ], acc = []) =>
x === undefined
? acc
: filterLikeTerms ( xs.filter (neq (x))
, acc.concat ([ xs.filter (eq (x)) ])
)
工作更聪明
正确的尾调用(紧接在上面)使我们使用大量数据输入,但是我们的函数效率非常低,因为为列表中的每个项运行多个过滤器。我们可以使用Map进行显着改进 - 现在我们只触摸原始输入中的每个项目一次
const filterLikeTerms = ([ x, ...xs ], acc = new Map) =>
x === undefined
? Array.from (acc.values ())
: acc.has (x)
? filterLikeTerms (xs, acc.set (x, [x].concat (acc.get (x))))
: filterLikeTerms (xs, acc.set (x, [x]))
const data =
['a', 'b', 'c', 'd', 'a', 'b', 'c', 'd', 'a', 'a', 'b']
console.log (filterLikeTerms (data))

不要停止学习
你可以自己制作各种各样的东西。以下是我写的与此答案相关的一些内容:
Map
答案 1 :(得分:0)
在ES6中:
public class Main {
public static void main(String[] args) {
byte b = -2;
int i = 0 ;
i = ( b & 0b1111_1111 ) ;
System.err.println(i);
}
}