【问题标题】:Sum all the numbers in a string对字符串中的所有数字求和
【发布时间】:2020-10-29 23:56:36
【问题描述】:

我在下面有一个递归函数,我只是想知道如何使用迭代方法(即没有递归的循环)创建相同的函数。

function recursiveCalculate(number, sum) { // num is expected to be a string
    sum = sum || 0;
    if (number.length === 0) {
        return sum;
    }
    return recursiveCalculate(number.slice(1), sum + +number[0]);
}

console.log(recursiveCalculate('145'))

【问题讨论】:

    标签: javascript


    【解决方案1】:

    在这里,有一个很好的方便的演示:

    function recursiveCalculate(number, sum) {
        sum = sum || 0;
        for (i=0; i<number.length; i++) {
            sum += Number(number.charAt(i));
        }
        return sum;
    }
    console.log(recursiveCalculate('145'))
    <input type="number" id="input"></input>
    <button onclick="console.log(recursiveCalculate(document.getElementById('input').value));">Check</button>

    【讨论】:

      【解决方案2】:

      我不想直接给你答案,所以这里是一个提示。

      1. charAt 函数获取特定索引处的字符
      2. parseInt 将字符转换为数字的函数

      然后你能想出一种方法来迭代字符串以总结数字吗?

      提示:在使用迭代方法时,请考虑使用 for 循环

      【讨论】:

        【解决方案3】:

        简单地使用数组reduce

        const recursiveCalculate=num=>[...num].reduce((t,v)=>t+Number(v),0)
         
        console.log(recursiveCalculate('145'))

        【讨论】:

          【解决方案4】:

          在传递的字符串的每个字符处拆分 - 然后使用 .reduce() 将所有数字相加 - 请注意 a) 每个元素都被解析为一个数字,因为它来自字符串,并且 b) 输入 0 作为reduce 函数中求和的起始整数。

          function recursiveCalculate(str){
            return str.split('').reduce(function(a, b){return a + parseInt(b);}, 0);
          }
          
          console.log(recursiveCalculate('145')); // gives 10

          【讨论】:

            【解决方案5】:

            可以将字符串拆分(或展开)为单个字符,将它们强制转换为数字并将它们相加。对于这个Array#reduce 可能是很自然的选择:

            [...'145'].reduce((sum, n) => sum + Number(n), 0)
            //=> 10
            

            但这不会考虑字符串中的负数:

            [...'-145'].reduce((sum, n) => sum + Number(n), 0)
            //=> NaN
            

            假设结果应该是-1 + 4 + 5 = 8,那么我们需要将减号与它所属的数字保持一致:

            '-145'.match(/(\-?\d)/g).reduce((sum, n) => sum + Number(n), 0)
            //=> 8
            

            如果你有小数怎么办?您需要将. 符号之后的所有数字放在一起。幸运的是,我们可以稍微调整一下上面的正则表达式:

            '-145.08'.match(/(\-?\d|\.\d+)/g)
            //=> ['-1', '4', '5', '.08']
            

            不用担心.08 它会很好地转换:Number('.08') //=&gt; 0.08

            有了所有这些知识,我们可以构建sum_str,如下所示:

            const sum_str = str => str.match(/(\-?\d|\.\d+)/g).reduce((sum, n) => sum + Number(n), 0);
            
            sum_str('145');
            //=> 10
            
            sum_str('-145');
            //=> 8
            
            sum_str('-145.08');
            //=> 8.08
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-01-05
              • 2022-07-22
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多