使用递归 - javascript从数字中添加数字

时间:2013-09-05 00:56:49

标签: javascript function recursion

我是javascript或任何其他编程语言的初学者。我已设法制作一个脚本来总结数字中的数字。

function sumDigits(number){
  var number = Math.floor(Math.random() * 100) + 1;
  var result = number.toString().split("");
  var last = eval(result.join('+'));
  return last;
}
document.write(sumDigits());

如何使用递归函数执行此操作,我也是递归术语的新手。

6 个答案:

答案 0 :(得分:1)

小提琴:http://jsfiddle.net/Hu3Gk/

function sumDigits(number) {
    var remainder = number % 10;
    var sum = remainder;
    if(number >= 10) {
        var rest = Math.floor(number / 10);
        sum += sumDigits(rest); 
    }
    return sum;
}

答案 1 :(得分:1)

可能有一个更优雅的解决方案,但这应该可以解决问题。

function sumDigits(number) {
  // defaul the sum to 0
  var sum = 0;

  // split the number into its individual digits
  var numbers = number.toString().split("");

  // check if there are still digits in the number
  while(numbers.length > 0) {
    // add the next number (numbers[0]) to the sum
    sum += parseInt(numbers[0], 10);

    // remove the number that was just added to sum
    numbers.splice(0, 1);

    // invoke sumDigits passing the new number 
    // (the previous number excluding the first digit) 
    sumDigits(numbers.join(''));
  }

  // return the sum!
  return sum;
}

http://jsfiddle.net/6RRbd/4/

答案 2 :(得分:0)

你不需要递归。尝试:

function sumNums(number){
  var n = 0, num = number.toString().split('');
  for(var i in num){
    n += +num[i];
  }
  return n;
}
console.log(sumNums(125));

答案 3 :(得分:0)

“递归”函数是一个调用自身的函数,直到你告诉它停止为止。这是一个简单的例子:

奥利奥饼干塔配方:

您将需要:

1奥利奥饼干塔(可选)

1奥利奥饼干

路线:

  1. 如果您有奥利奥饼干塔,请从中取出顶部巧克力饼干,然后食用
  2. 如果您有奥利奥饼干塔,请从奥利奥饼干中取出顶部巧克力饼干,然后食用它
  3. 如果您有奥利奥饼干塔,请将奥利奥饼干塔露出的奶油表面放在奥利奥饼干暴露的奶油表面上
  4. 整个想法是你可以根据需要多次重复这个食谱,你的饼干塔会变得像你想要的一样大。

    在该示例中,“可选”一词将奥利奥饼干塔成分转换为您可能看到的另一个短语。如果你曾经看过“逃避条件”一词,那就是它所指的。

    递归执行此操作的最佳方法是使用辅助函数。喜欢这个

    function sumDigitsHelper(result){
        // check to see if result is empty here. If it is, return 0.
        // grab the first number from result here and store it in a variable called "first"
        // grab the rest of the array here and store it in a variable called "rest"
        // return first + sumDigitsHelper(rest)
    }
    function sumDigits(number){
        var number = Math.floor(Math.random() * 100) + 1;
        var result = number.toString().split("");
        // I'll leave this commented so you can remember what it does
        //  var last = eval(result.join('+'));
        return sumDigitsHelper(number);
    }
    

    只需用代码替换我的评论。

答案 4 :(得分:0)

function sumDigits(n){
  return n == 0 ? 0 : n % 10 + sumDigits(Math.floor(n/10));
}

答案 5 :(得分:0)

另一种方法是将数字最初转换为函数内的数组。

然后,每次在第一个元素上添加array[0]slice

function sumDigits (num) {
  let array = String(num).split("").map(Number);
  if (array.length === 0) {
    return 0;
  }
  else {
    return array[0] + sumDigits(array.slice(1).join(""));
  }
}
console.log(sumDigits(679));

注意,您必须在.join("")之后添加slice(1),以便第二次将 string 传递给函数,而不是数组。

否则,您将传入[6, ',', 7],它映射到号码[6, NaN, 7],然后超出调用堆栈。