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

Adding digits from a number, using recursivity - javascript

本文关键字:数字 添加 javascript 递归      更新时间:2023-09-26

我是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());

如何使用递归函数来实现这一点,我也是递归这个术语的新手。

Fiddle: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;
}

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

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/

您不需要递归。尝试:

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

"递归"函数是一个在您通知它停止之前一直调用自己的函数。这里有一个快速的例子:

奥利奥饼干塔配方:

您将需要:

1奥利奥饼干塔(可选)

1奥利奥饼干

方向:

  1. 如果你有一个奥利奥饼干塔,把上面的巧克力饼干片拿出来吃
  2. 如果你有一个奥利奥饼干塔,从奥利奥饼干上取下顶部的巧克力饼干片,然后吃
  3. 如果你有奥利奥饼干塔,将奥利奥饼干塔内暴露的奶油表面放在奥利奥饼干的暴露奶油表面上

整个想法是,你可以随心所欲地重复这个食谱,你的饼干塔就会变得像你想要的那样大。

在这个例子中,"可选"一词将奥利奥饼干塔的成分变成了你可能见过的另一个短语。如果你曾经见过"逃逸条件"这个词,那就是它所指的

递归执行此操作的最佳方法是使用helper函数。像这个

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);
}

只需将我的评论替换为代码。

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

另一种方法是将数字转换为数组,最初在函数中。

然后,每次将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));

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

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