递归实现阶乘

源码下载

  本节课利用if/else、return、function,递归方法实现阶乘的计算,递归是编程中很重要的一个概念。

for循环迭代的方法

  前面讲解过这个案例,这里不再详述,大家可以与下面的代码对照比较。

  上面的计算方式用数学表达式描述就是S=1*2*3.....*10

10       //声明阶乘结果变量S,赋值初始值1.
11       var S = 1;
12       for(var i = 1;i<11;i++){
13           S *= i;
14       }

递归方法

  下面的代码和上面的最终计算结果是一样的,知识程序的执行过程,对内存的操作方式不同。

  递归实现阶乘计算,从数学的角度用公式描述,一个函数f(n)=n,一个计算公式X=f(n)*f(n-1)*f(n-2)....*f(1)。

19       //声明递归函数recursion,参数n是要执行阶乘的正整数
20       function recursion(n) {
21            if(n == 1){
22                return 1;
23            }
24            else{
25                return n*recursion(n-1);
26            }
27       }
28       //调用递归函数,执行10的阶乘,return返回结果赋值给变量X
29       let X = recursion(10); 

  递归的代码结构比较巧妙,如果凭空像是难以理解的,会写代码之前应该先会读,简单代码按照语句去读,复杂的代码,可以先自己代入变量模仿电脑执行,过一遍。先来看第20到第27行的代码, 里面是一个if/else结构,if、else if里面可以添加判断条件,else表示的就是除了if、else if所约束的条件以外的所有条件else里面的代码都会执行。假设函数传输的参数n是正整数, 本代码环境下表示的就是,只要n大于1,都会执行第25行的代码。

  第29行代码调用函数recursion执行过程,n=10,首先判断n是否等于1,“10 == 1”执行比较运算符 == ,会返回false,if里面的语句不会执行,if后面没有别的if或else if语句,直接去执行else 里面的语句,return关键字执行n*recursion(n-1),返回结果10*recursion(9),这个结果恢赋值给变量X,也就是说此时程序的状态是X=10*recursion(9),X=10*recursion(9)里的recursion(9)会再次调用函数recursion, 并重新传入参数9,再次重复上面的过程,多次循环后,当执行到X=10*9*8*7.....*recursion(1)时,执行if(n == 1)语句,“1 == 1”返回true,此时if(true),程序会执行if大括号里面的代码,返回结果1,最终得出X。

总结

  for循环里面,变化的是变量i,用变量i来表达所有的计算元素10/9/8....1,递归的程序变化的是函数参数,运算单位是函数,用函数表达所有的计算元素10/9/8....1。