使用递归函数将数字的每个数字存储在arr中

时间:2017-07-26 04:51:47

标签: javascript recursion numbers

我正在尝试使用递归方法编写一个函数来保存数组中任何给定数字的所有数字,但它停在第一个数字并且循环不起作用,有人能告诉我我做错了什么?

function digit(n) {
   var arr = [];
   if (n < 10) {
       return arr.push(n);
   } else {
       var dig = n % 10;
       arr.push(dig);
       digit(Math.floor(n / 10));
   }
   return arr;
}

8 个答案:

答案 0 :(得分:1)

因为您每次都将arr重置为空数组,所以它永远不会到达任何地方。您需要将它存储在递归函数之外并在最后返回它。

&#13;
&#13;
function digit(d) {
    var arr = [];
    
    function store_digit(n) {
      if (n < 10) {
          return arr.push(n);
      } else {
          var dig = n % 10;
          arr.push(dig);
          store_digit(Math.floor(n / 10));
      }
    }
    
    store_digit(d);
    console.log(arr)
    return arr;
}

digit(682)
&#13;
&#13;
&#13;

答案 1 :(得分:0)

递归是正确的,但是你没有正确使用返回的值,你只会按照你正在做的方式返回最后一位数,你需要连接从连续方法调用返回的数组。这样的事情似乎有效:

&#13;
&#13;
function digit(n){
   var arr = [];
   if(n<10){
      arr.push(n);
   }else{
      var dig = n % 10;
      arr.push(dig);
      arr = arr.concat(digit(Math.floor(n /10)));
   }
   return arr;
}
console.log(digit(999));
&#13;
&#13;
&#13;

答案 2 :(得分:0)

代码正在运行所有数字。由于每次运行函数时都在初始化数组,因此它只返回最后一个运行数字。

试试这个:

var arr = [];
function digit(n) {
  if (n < 10) {
    return arr.push(n);
  }
  else {
    var dig = n % 10;
    arr.push(dig);
    digit(Math.floor(n / 10));
  }
}
digit(123456789)
console.log(arr)

答案 3 :(得分:0)

digit(123456);

function digit(n) {
   var arr = [];
   if (n < 10) {
       arr.push(n);
   } else {      
    numberToString = n.toString();

    for (var i = 0, len = numberToString.length; i < len; i += 1) {
        arr.push(+numberToString.charAt(i));
    }

      console.log(arr);
   }

}

答案 4 :(得分:0)

到目前为止给出的所有答案都有正确的想法。这个想法表达的更为简单:

function digits(n, result=[]){
    return n < 10
      ? result.concat([n]).reverse()
      : digits(Math.floor(n / 10), result.concat([n % 10]);
}

digits(1234); //=> [1, 2, 3, 4]

如果预期输出从最小顺序到最大顺序而不是从最大到最小,则可以删除.reverse()

demo

答案 5 :(得分:0)

您可以使用干净的方法,其中函数的每次调用都会返回有效的部分结果。

开始时,您可以定义recursion temination,如果n的值小于10,则会给出{{3}}。在这种情况下,您将返回一个值为。

的数组

在所有其他情况下,返回整数值n除以10的递归调用的结果,并将除法的其余部分连接10

此提案不使用其他显式临时变量。

&#13;
&#13;
function getDigits(n) {
    if (n < 10) {
        return [n];
    }
    return getDigits(Math.floor(n / 10)).concat(n % 10);
}

console.log(getDigits(123456));
&#13;
&#13;
&#13;

对于更简洁的风格,您可以使用与上述相同的三元组。

&#13;
&#13;
function getDigits(n) {
    return n < 10 ? [n] : getDigits(Math.floor(n / 10)).concat(n % 10);
}

console.log(getDigits(123456));
&#13;
&#13;
&#13;

答案 6 :(得分:0)

使用点差运算符:

function getDigits(num, radix = 10) {
    return num < radix ?
        [num] :
        [...getDigits(Math.floor(num / radix), radix), (num % radix)];
}
getDigits(0xCAFEBABE, 0x10);
// ==> [12,  10,  15,  14,  11,  10,  11,  14] 

答案 7 :(得分:-1)

代码:

var arr = [];

function digit(n){

   if (n<10) {
        return arr.push(n);
   } else {
     var dig = n % 10;
     arr.push(dig);
     digit(Math.floor(n /10));
   }
   return arr;

}