0

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

我如何使用递归函数来做到这一点,我对递归这个术语也很陌生。

4

6 回答 6

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/

于 2013-09-05T02:49:15.093 回答
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;
}
于 2013-09-05T01:03:12.903 回答
0

“递归”函数是一个在您告诉它停止之前调用自身的函数。这是一个简单的例子:

奥利奥饼干塔食谱:

你会需要:

1个奥利奥饼干塔(可选)

1个奥利奥饼干

方向:

  1. 如果你有奥利奥饼干塔,把上面的巧克力饼干薄饼拿出来吃
  2. 如果你有奥利奥饼干塔,从奥利奥饼干上取下顶部的巧克力饼干薄饼并吃掉它
  3. 如果您有奥利奥曲奇塔,请将奥利奥曲奇塔的外露奶油面放在奥利奥曲奇外露的奶油面上

整个想法是,您可以根据需要多次重复该食谱,并且您的饼干塔会变得与您想要的一样大。

在该示例中,“可选”一词将奥利奥曲奇塔成分变成了您可能见过的另一个短语。如果您曾经看到“逃生条件”一词,那就是它所指的。

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

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

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

于 2013-09-05T01:26:20.443 回答
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));
于 2013-09-05T01:12:13.863 回答
0
function sumDigits(n){
  return n == 0 ? 0 : n % 10 + sumDigits(Math.floor(n/10));
}
于 2017-11-07T21:33:49.010 回答
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)以便第二次将字符串而不是数组传递给函数。

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

于 2019-06-26T19:04:10.620 回答