Javascript 通过无限循环运行的递归
我刚从递归开始,所以我在解决一个问题 创建一个函数,该函数将数字作为参数,将它们相加,并返回数字的乘积,直到答案只有1位数 所以我把递归作为Javascript 通过无限循环运行的递归,javascript,Javascript,我刚从递归开始,所以我在解决一个问题 创建一个函数,该函数将数字作为参数,将它们相加,并返回数字的乘积,直到答案只有1位数 所以我把递归作为 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();
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));
函数sumDigProd(…位){
设ans=数字。减少((a,b)=>a+b,0);
控制台日志(ans);
常数结果=计算值(ans);
函数计算(ans){
ans=ans.toString();
设pro=1;
for(设i=0;i10){
calc(pro);
}
return-pro
}
返回结果
}
console.log(sumDigProd(16,28));
所以我在无限循环中运行它您没有分配递归调用的返回值 此外,您正在混合迭代解决方案(使用
而使用)和递归解决方案。你需要两个中的一个,而不是两个
对于递归解决方案,您可以使用if
。在这种情况下,您甚至可以立即从递归调用返回返回值
此外,条件应为pro>=10
,因为10不能作为最终值:
函数sumDigProd(…位){
设ans=数字。减少((a,b)=>a+b,0);
控制台日志(ans);
函数计算(ans){
ans=ans.toString();
设pro=1;
for(设i=0;i=10){
返回计算(pro);//递归大小写
}
return pro;//基本情况
}
返回计算(ans);
}
console.log(sumDigProd(16,28))代码>您只需分配pro
并将while
更改为if
:
函数sumDigProd(…位){
设ans=数字。减少((a,b)=>a+b,0);
控制台日志(ans);
常数结果=计算值(ans);
函数计算(ans){
ans=ans.toString();
设pro=1;
for(设i=0;i=10){
pro=计算值(pro);
}
return-pro
}
返回结果
}
console.log(sumDigProd(16,28,12))代码>稍微短一点的版本:
function sumDigProd(a, b){
let rec = function(a) {
if (String(a).length == 1) return a;
return rec(String(a).split('').map(Number).reduce((a,b)=>a*b));
}
return rec(a+b);
}
您可以返回调用calc
得到递归结果的结果
函数sumDigProd(…位){
函数计算(ans){
让pro=[…ans.toString()]reduce((a,b)=>a*b);
返回pro>9
?计算(专业)
:pro;
}
返回计算(数字减少((a,b)=>a+b,0));
}
console.log(sumDigProd(16,28));//6.
log(sumDigProd(1,2,3,4,5,6));//2
社论:我发现这里的一些答案很聪明,但更难理解,下面是另一个添加值的示例,如果有多个值,则将数字相乘
递归:和的数字的乘积
const sumDigitProduct=(num,…rest)=>{
if(剩余长度)
num=sumDigitProduct(rest.reduce((agg,cv)=>agg+parseFloat(cv,num))
常量数字=(''+num).split('')
如果(位数.长度>1)
num=sumDigitProduct(digits.reduce((agg,cv)=>agg*parseFloat(cv)))
返回num;
};
//测验
log('expect:3;got:',sumDigitProduct(1,2))
log('expect:5;got:',sumDigitProduct(15))
log('expect:6;got:',sumDigitProduct(16,28))
log('expect:0;get:',sumDigitProduct(0))
console.log('expect:2;got:',sumDigitProduct(1,2,3,4,5,6))
这不需要递归。什么是sevenBoom()
?但我如何才能将递归看作this@kmoser抱歉,键入错误您没有分配递归调用的返回值。它应该被分配到pro
。谢谢它工作了…但是在任何情况下,这都可以通过while循环完成?你能更新代码吗?事实上,这就是我在寻找的…while loop..很抱歉,我没有清楚地提到它。这是我的答案。啊,@trincot在我写我的答案时偷偷地用了相同的答案!请注意,您并不真正需要递归,这是强制执行一些可以轻松删除并使用相同功能(如果不是更有效的话)的操作
function sumDigProd(a, b){
let rec = function(a) {
if (String(a).length == 1) return a;
return rec(String(a).split('').map(Number).reduce((a,b)=>a*b));
}
return rec(a+b);
}