Javascript 递归-寻找最小数
我正在学习递归,想知道我的解决方案有什么问题。我试图用递归找到最小的数我知道用循环等更容易,但当我学习递归时,我尝试为此编写一个递归函数。谢谢Javascript 递归-寻找最小数,javascript,recursion,Javascript,Recursion,我正在学习递归,想知道我的解决方案有什么问题。我试图用递归找到最小的数我知道用循环等更容易,但当我学习递归时,我尝试为此编写一个递归函数。谢谢 function min(arr) { if (arr.length==1){ return arr[0]; } else if(arr[0]>arr[1]) { return min(arr.slice(1)); } else { min(arr[0]+ arr.slice(2)); }
function min(arr) {
if (arr.length==1){
return arr[0];
}
else if(arr[0]>arr[1]) {
return min(arr.slice(1));
}
else {
min(arr[0]+ arr.slice(2));
}
}
min([-5,4,0,8,5]);
您需要使用concat来连接数组,而不是+。试试这个:
function min(arr) {
if (arr.length==1){
return arr[0];
}
else if(arr[0]>arr[1]) {
return min(arr.slice(1));
}
else {
return min([arr[0]].concat(arr.slice(2)));
}
}
这里有一个文档链接:应用于此问题的递归的经典形式是:
function min(a) {
function smaller(a, b) { return a < b ? a : b; }
return a.length ? smaller(min(a.slice(1)), a[0]) : Infinity;
}
在ES6中:
function min([head, ...tail]) {
function smaller(a, b) { return a < b ? a : b; }
return head === undefined ? Infinity : smaller(head, min(tail));
}
这里是另一种方法,它将当前最小值传递给每个递归迭代。这样做的优点是可以进行尾部优化。巴贝尔成功地做到了这一点
function min([head, ...tail], cur = Infinity) {
return head === undefined ? cur : min(tail, head < cur ? head : cur);
}
您忘记了上次递归调用之前的返回。我[…]想知道我的解决方案有什么问题,为什么您认为有什么问题?您得到的输出是什么?您期望得到什么?或者你有错误吗?你认为arr[0]+arr.slice2在做什么?我希望得到最小的数字,我把arr[0]+arr.slice2放在这里,因为应该用数组再次调用min fun,但如果arr[0]使用调试器遍历代码,则排除arr[1]。我根本不理解你的解决方案。谢谢!它起作用了。使用+是错误的,因为它是一个数组,而不是字符串或存储在我要添加的变量中的值,对吗?是的。有趣的是,Javascript并没有向您抱怨您实际上使用+运算符将数组转换为字符串,它仍然将字符串返回到min函数中并尝试完成该函数!ES6版本是一个非常好的解构示例,也是一个易于阅读的实现。
function recursiveMinNumber(items){
if(items.length === 1){
return items[0] //Base-case reached
}
else{
if(items[0]<=items[items.length-1]){
items.pop() //remove the last item in the array
return recursiveMinNumber(items)
}
else{
return recursiveMinNumber(items.slice(1)) //remove the first item in the array
}
}
}
console.log(recursiveMinNumber([2,22,3,3,4,44,33]))