递归 - 查找最小的数字

时间:2016-05-28 00:11:48

标签: 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)); 
  }
}
min([-5,4,0,8,5]);

3 个答案:

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