我正在学习递归,并想知道我的解决方案有什么问题。我试图使用递归找到最小的数字(我知道使用循环等更容易,但因为我正在学习递归,我尝试为此编写递归函数)。谢谢!
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]);
答案 0 :(得分:3)
应用于此问题的经典递归形式将是:
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);
}
答案 1 :(得分:1)
您需要使用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)));
}
}
这是一个文档链接:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/concat
答案 2 :(得分:0)
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]))