递归实现阶乘
源码下载本节课利用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。