Javascript find()的递归版本
我要做的是创建一个递归版本的find,它接受一个数组和一个测试函数,并返回通过测试的数组的第一个元素。让我们来看一个例子:Javascript find()的递归版本,javascript,recursion,find,Javascript,Recursion,Find,我要做的是创建一个递归版本的find,它接受一个数组和一个测试函数,并返回通过测试的数组的第一个元素。让我们来看一个例子: function isEven(num) { return(num%2 == 0); } var arr = [1, 3, 5, 4, 2]; function findRecursive(arr, func) { var p = arr.shift(); if (func(p) == true) return p; else
function isEven(num) { return(num%2 == 0); }
var arr = [1, 3, 5, 4, 2];
function findRecursive(arr, func) {
var p = arr.shift();
if (func(p) == true)
return p;
else
findRecursive(arr, func);
}
findRecursive(arr, isEven);
由于某种原因,我变得不明确了。但如果我在第5行将shift更改为pop,它将正确返回2。问题的原因是什么?您需要返回递归调用的值,否则返回
未定义的,Javascript中函数的标准
} else {
return findRecursive(arr, func);
// ^^^
}
如果没有更多要检查的元素,则可以插入数组长度检查。然后您可以故意返回未定义的
函数isEven(num){返回num%2==0;}
函数findRight(数组,fn){
如果(!array.length){
返回;
}
var p=array.pop();
返回fn(p)?p:findRight(数组,fn);
}
log(findRight([1,3,5,4,2],isEven));//2.
console.log(findRight([1,3,5],isEven));//未定义的
递归是在函数式编程环境中诞生的一种循环机制;把它从上下文中去掉只允许粗略地理解递归是如何使用的
当与其他函数式编程实践(如持久(不可变)数据类型和纯函数)一起使用时,递归可以漂亮地表示为纯表达式
const find=(f[x,…xs])=>
x==未定义
? x
:f(x)
? x
:查找(f,xs)
常数isEven=x=>
(x&1)==0
console.log(find(isEven[1,3,5,4,2])//4
console.log(find(isEven[1,3,5,7,9])//未定义
您忘记从findRecursive返回。对于您的else
子句,您应该返回findRecursive(arr,func)代码>请测试是否没有偶数值。@Matt,捕捉得好:-)你自己的重复出现,嗯。拿着,Rich Hickey!JS是DIY程序员的天堂。:)@克服JavaScript的一些“缺点”的毅力教会了我很多编程知识^_^