通过无限循环运行的递归

Rat*_*Rai 2 javascript

我刚开始使用递归,所以我正在解决一个问题,就像

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

所以我在无限循环中运行它

tri*_*cot 5

您没有分配递归调用的返回值。

此外,您正在将迭代解决方案(与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)