递归遍历无限循环

Ratnabh Kumar Rai:

大家刚刚开始递归,所以我正在解决一个类似

创建一个将数字作为参数的函数,将它们加在一起,然后返回数字乘积,直到答案只有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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章