我刚开始使用递归,所以我正在解决一个问题,就像
创建一个函数,将数字作为参数,将它们相加,然后返回数字的乘积,直到答案只有 1 位长。
sumDigProd(16, 28) ? 6
// 16 + 28 = 44
// 4 * 4 = 16
// 1 * 6 = 6
sumDigProd(0) ? 0
sumDigProd(1, 2, 3, 4, 5, 6) ? 2
Run Code Online (Sandbox Code Playgroud)
所以我用递归来做
function sumDigProd(...digits) {
let ans = digits.reduce((a, b) => a + b, 0);
console.log(ans);
const result=calc(ans);
function calc(ans) {
ans = ans.toString();
let pro = 1;
for (let i = 0; i < ans.length; i++) {
pro = pro * ans[i];
}
console.log(pro);
while (pro > 10) {
calc(pro);
}
return pro
}
return result
}
console.log(sumDigProd(16,28));
Run Code Online (Sandbox Code Playgroud)
所以我在无限循环中运行它
您没有分配递归调用的返回值。
此外,您正在将迭代解决方案(与while)与递归解决方案混合。您需要两者之一,而不是两者。
对于递归解决方案,您只需使用if. 在这种情况下,您甚至可以立即从递归调用中返回返回值。
此外,条件应该是pro >= 10,因为 10 作为最终值是不合适的:
function sumDigProd(...digits) {
let ans = digits.reduce((a, b) => a + b, 0);
console.log(ans);
function calc(ans) {
ans = ans.toString();
let pro = 1;
for (let i = 0; i < ans.length; i++) {
pro = pro * ans[i];
}
console.log(pro);
if (pro >= 10) {
return calc(pro); // recursive case
}
return pro; // base case
}
return calc(ans);
}
console.log(sumDigProd(16,28));Run Code Online (Sandbox Code Playgroud)
只需少量更改即可实现迭代解决方案:
function sumDigProd(...digits) {
let pro = digits.reduce((a, b) => a + b, 0);
console.log(pro);
while (pro >= 10) {
ans = pro.toString();
pro = 1;
for (let i = 0; i < ans.length; i++) {
pro = pro * ans[i];
}
console.log(pro);
}
return pro;
}
console.log(sumDigProd(16,28));Run Code Online (Sandbox Code Playgroud)
将代码压缩到更小的空间,它可能变成:
function sumDigProd(...digits) {
let pro = digits.reduce((a, b) => a + b, 0);
while (pro >= 10) {
pro = Array.from(pro.toString()).reduce((a, b) => a * b, 1);
}
return pro;
}
console.log(sumDigProd(16,28));Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
111 次 |
| 最近记录: |