0

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

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'))
4

5 回答 5

1

简单地使用数组减少

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

于 2020-10-30T00:11:45.890 回答
1

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

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

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

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

于 2020-10-30T00:09:42.057 回答
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>

于 2020-10-30T00:13:46.820 回答
1

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

function recursiveCalculate(str){
  return str.split('').reduce(function(a, b){return a + parseInt(b);}, 0);
}

console.log(recursiveCalculate('145')); // gives 10

于 2020-10-30T00:13:59.813 回答
0

可以将字符串拆分(或展开)为单个字符,将它们强制转换为数字并将它们相加。因为这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') //=> 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
于 2020-10-30T10:10:32.667 回答