首页 > 解决方案 > 阶乘递归,给出未定义

问题描述

我试图简单地找到递归阶乘

 function factorial(num, result) {
  console.log('num', num)
  if (num === 0) {
    console.log('res ', result);
    return result;
  } else {
    result = result * num;
    console.log(result)
    factorial(--num, result);
  }
}

let res = factorial(3, 1)
console.log(res)

它给出了undefined,不知道为什么,需要一些帮助。

plnkr

标签: javascript

解决方案


除了缺少的return陈述,一些注释:

  • 使用结果的默认值。这允许在没有给定起始值的情况下调用函数,并且只允许使用单个参数。

  • 仅提前一次退出递归调用,不与 .else组合使用return。该return语句省略了以下else语句。继续编写没有else部分的代码。

  • 在函数末尾返回一个递归调用,以允许使用编译器进行 TCO(尾调用优化)。这在不扩展堆栈的情况下工作,因为最后一次调用被实际的递归调用替换。这种优化可能实际上并没有实现。

  • 如果您只需要减少的值而不再次使用减少的值,请不要使用减量运算符。

  • 将计算移到函数调用中。

function factorial(num, result = 1) {
    console.log('num', num);
    if (num === 0) return result;
    return factorial(num - 1, result * num);
}

console.log(factorial(3))


推荐阅读