js实现递归,尾递归(递归优化),防止栈溢出

一、一版的递归实现 n!,比如 5!= 5 * 4 * 3 * 2 *1

      function fact(n) {

            if(n == 1) {

                   return 1;

            }else{

                    return n * fact(n-1)

           }

      }

      fact(10) //3628800;

     但这样就会保持10条记录,这样很容易造成栈溢出;我们可以这样理解,执行一个函数A,添加一个记录A,在函数A中调用函数B,添加一个记录B,等函数B执行完了之后,移除记录B,把控制器交给A。因为递归就是函数里面调用函数,所以会有10条记录。

二、尾递归

       function fact(n) {

             return fact_iter(n,1)

       }

      function fact_iter(num, product){

               if(num == 1) {

                      return product;

                 }else{

                     return fact_iter(num-1, num * product);

              }

      }

      fact(10) //3628800;

     这样就只保存一条记录,不会造成栈溢出。而这个为什么只有一条记录呢?这是因为函数fact_iter返回的是它本身,返回本身之后,它就不再需要控制器了(就是没它什么事了,它把任务交个了下家了),所以不会进栈,就不会有这条记录。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值