递归调用• 使用递归求解问题,通常可以将一个比较大的问题层层转化为一个与原问题相类似的、规模较小的问题进行求解,最终达到对原问题的求解。 • 用递归计算 n !n !可以由下列公式表示:n !1 n=0n(n-1)! n>0分析:把求 n !转化为求( n-1 )!的问题,因为( n-1 )!乘上 n 就是 n !。而求( n-1 )!又可以转化为求( n-2 )!的问题,… . 最后归结到求 0 !的问题,而 0 !已定义为 1 。由 0 ! =1 又一步步反上去求出 1 !, 2 !,… . 直到求出 n !。Program p7_20(input,output); var n:integer; s:integer;Function fac(a:integer):integer;Begin if a=0 then fac:=1 else fac:=a*fac(a-1);End;BeginReadln(n);S:=fac(n);Writeln(n,’!=’,s)End. 能用递归算法求解的问题一般应该满足如下要求:• 符合递归的描述:需要解决的问题可以化为子问题求解,而子问题求解的方法与原问题相同,只是数量增大或减少;• 递归调用的次数是有限的;• 必须有递归结束的条件。用递归方法求两个数 m 和 n 的最大公约数Program p7_21(input,output);Var m,n,g:integer;Function gcd(m,n:integer):integer; var r:integer; begin r:=m mod n; if r=0 then gcd:=n else gcd:=gcd(n,r);End;Begin read(m,n);g:=gcd(m,n);Writeln(‘m=’,m,’n=’,n,’gcd=’,g);End.输入一串以‘!’结束的字符,按逆序输出Program p7_22(input,output);Procedure rever; var c:char;Begin read(c); if c<>’!’ then rever; write(c);End;Begin rever;End.Program p7_23(input,output);Var x:integer;Function up(var n:integer):integer;Forward;Function down(var n:integer):integer; begin n:=n div 2; writeln(n,’in down’); if n<>1 then n:=up(n);End;Function up;Begin while(n mod 2)<>0 do begin n:=n*3+1;Writeln(n,’in up’);End;N:=down(n);End;BeginWrite(‘input x:’);Readln(x);X:=up(x);Writeln(‘ok’)End.运行:Input x:63 in down10 in up5 in down16 in up8 in down4 in down2 in down2 in downok