Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 递归-寻找最小数_Javascript_Recursion - Fatal编程技术网

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]))