【问题标题】:Adding digits from a number, using recursivity - javascript使用递归从数字中添加数字 - javascript
【发布时间】:2013-09-05 00:56:48
【问题描述】:

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

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

【问题讨论】:

  • 这是在告诉我们您不知道“递归”是什么意思的迂回方式吗?
  • 从数字中求和?将其转换为字符串,循环遍历它将每个数字添加到前一个数字。 String-Number 必须转换回整数。
  • 我只是为自己测试javascript,如果可以的话,请随时提供帮助。

标签: javascript function recursion


【解决方案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;
}

【讨论】:

  • 糟糕,我最初误解了这个问题。我更新了我的答案:)
【解决方案2】:

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

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/

【讨论】:

    【解决方案3】:

    您不需要为此进行递归。试试:

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

    【讨论】:

      【解决方案4】:

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

      奥利奥饼干塔食谱:

      你需要:

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

      1 块奥利奥饼干

      方向:

      1. 如果您有奥利奥曲奇塔,请将顶部的巧克力曲奇威化饼取出并食用
      2. 如果您有奥利奥曲奇塔,请从奥利奥曲奇中取出顶部的巧克力曲奇薄饼并食用
      3. 如果您有奥利奥饼干塔,请将奥利奥饼干塔的外露奶油面放在奥利奥饼干外露的奶油面上

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

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

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

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

      只需用代码替换我的 cmets。

      【讨论】:

        【解决方案5】:
        function sumDigits(n){
          return n == 0 ? 0 : n % 10 + sumDigits(Math.floor(n/10));
        }
        

        【讨论】:

          【解决方案6】:

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

          然后,每次从第一个元素中添加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],然后超出调用堆栈。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-09-27
            • 1970-01-01
            • 2020-03-28
            • 2021-08-20
            • 2020-05-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多