Javascript 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

我要做的是创建一个递归版本的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 
        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的一些“缺点”的毅力教会了我很多编程知识^_^