大家刚刚开始递归,所以我正在解决一个类似
创建一个将数字作为参数的函数,将它们加在一起,然后返回数字乘积,直到答案只有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
所以我做了递归
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));
所以我在无限循环中运行它
您没有分配递归调用的返回值。
另外,您正在将迭代解决方案(与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));
只需很少的更改即可实现迭代解决方案:
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));
将代码压缩到较小的占用空间后,可能会变成:
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));
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句