JS的函数递归阶乘问题?

        function jiecheng(n){
            if(n==1){
                return 1
            }else{
                return n*jiecheng(n-1)    
            }
        }
        var n=5;
        alert(jiecheng(6))

怎么理解这段代码的计算过程,特别是里面return后面n*jiecheng(n-1)是什么意思?

求各位大神指教 谢谢谢谢

阅读 4.6k
4 个回答

从数学上理解:

f(n) = n!
f(n - 1) = (n-1)!
f(n) = n * (n-1)!
f(n) = n * f(n-1)
当 n = 1 时,f(1) = 1 

函數有個參數是n
邏輯:
首先判斷n是否等於1
是返回1.否則返回 n* jiechange(n -1)

跟住我們看輸入 執行函數
jiecheng(6)
n = 6 肯定是大於1
所以 返回值 6 jiecheng(6-1) 即 6 jiecheng(5) 左邊6就不解釋 右邊的jiecheng(5) 就是函數jiecheng的結果
往後可以看出
直到n等於一時候,這個方法其實不斷在遞歸
6 (5 (4 3 (2 * jiecheng(1))))
即等於一時jiecheng 直接返回1
即 6 5 4 3 2 * 1

跟著你問為什麼 var n = 5 ,為什麼函數不從5開始,那樣就要看js的作用域了

这里形成了一个循环,当n等于1的时候循环停止。
函数 jiecheng(n){}的量有两个,通过if...else来给值。
如果n的量==1,那么函数jiecheng(n){}里n的量就是1,循环停止
不然n的量>1,把生成的n量带入代数公式n*jiecheng(n-1)里面,再把运算的结果给到jiecheng(n){}函数,
这里就形成了循环,每次n-1就会生成新的n值,就导致上面的代码再执行一遍,一直到代码n取得的值为1,那么进入if..else判断里面的if条件n==1,循环停止。
而alert(jiecheng(n));里面n就是值得取得。
我是这样理解的,你参考一下吧。

这是一个递归大致的流程拆解下来就是5(4(3(2jiecheng(1)))
这时候一传进来就是一,带入数学的乘法运算就是5(4(3(21))
最后根据数学的乘法结合律54321最后得到结果

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题