Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/463.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过无限循环运行的递归_Javascript - Fatal编程技术网

Javascript 通过无限循环运行的递归

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();

我刚从递归开始,所以我在解决一个问题

创建一个函数,该函数将数字作为参数,将它们相加,并返回数字的乘积,直到答案只有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();
    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);
}