1、递归调用,使用递归求解问题,通常可以将一个比较大的问题层层转化为一个与原问题相类似的、规模较小的问题进行求解,最终达到对原问题的求解。,用递归计算n! n!可以由下列公式表示:n!,1 n=0,n(n-1)! n0,分析:把求n!转化为求(n-1)!的问题,因为(n-1)!乘上n就是n!。而求(n-1)! 又可以转化为求(n-2)!的问题,.最后归结到求0!的问题,而0!已定义为1。 由0!=1又一步步反上去求出1!,2!,.直到求出n!。,Program p7_20(input,output);varn:integer;s:integer; Function fac(a:integer):i
2、nteger; Beginif a=0 then fac:=1else fac:=a*fac(a-1); End;Begin Readln(n); S:=fac(n); Writeln(n,!=,s) End.,能用递归算法求解的问题一般应该满足如下要求: 符合递归的描述:需要解决的问题可以化为子问题求解,而子问题求解的方法与原问题相同,只是数量增大或减少; 递归调用的次数是有限的; 必须有递归结束的条件。,用递归方法求两个数m和n 的最大公约数,Program p7_21(input,output); Varm,n,g:integer; Function gcd(m,n:integer):i
3、nteger;var r:integer;beginr:=m mod n;if r=0 then gcd:=nelse gcd:=gcd(n,r); End; Beginread(m,n); g:=gcd(m,n); Writeln(m=,m,n=,n,gcd=,g); End.,输入一串以!结束的字符,按逆序输出,Program p7_22(input,output); Procedure rever;var c:char; Beginread(c);if c! then rever;write(c); End; Beginrever; End.,Program p7_23(input,ou
4、tput); Varx:integer; Function up(var n:integer):integer; Forward; Function down(var n:integer):integer;beginn:=n div 2;writeln(n,in down);if n1 then n:=up(n); End; Function up; Beginwhile(n mod 2)0 dobeginn:=n*3+1; Writeln(n,in up); End; N:=down(n); End; Begin Write(input x:); Readln(x); X:=up(x); Writeln(ok) End.,运行: Input x:6 3 in down 10 in up 5 in down 16 in up 8 in down 4 in down 2 in down 2 in down ok,