31/73 #include void main ( ) { int n, p; printf (
=?);scanf (%d, &n); p = fact (n); printf (%d!=%d\n, n, p); } int fact ( int n ) { int r; if ( n == 1 ) r = 1; else r=n* fact (n-1); /* 递归调用 */ return (r);} ? 用递归函数求 n! – n! = 1 当 n = 1 时 – n! = n * (n-1)! 当 n > 1 时 32/73 void main( ) { … p=fact(4); … } fact( 4 ) { … r=4*fact(3); … return 24 } fact( 3 ) { … r=3*fact(2); … return 6 } fact(2 ) { … r=2*fact(1); … return 2 } fact(1 ) { … r=1; … return 1 } 递归调用执行过程 递 推 回 推 33/73 3 .编制递归函数的方法 ⑴ 数值型问题递归函数的编程方法 对于数值型问题,首先要找出解题的数学公式, 这个公式必须是 递归定义 的,且所处理的 对象要 有规律地递增或递减 ,然后确定 递归结束条件 。 【例 8.17 】编一递归函数求 x n 。 思路:首先把 x n 转化成递归定义的公式 x n = 1 ( n=0 ) x × x n - 1 ( n>0 ) 再找出递归结束条件:当 n=0 时, x n =1 。 34/73 程序如下: #include long xn(int x,int n) { long f=0; if (n<0) printf(
<0,data error!\n); else if (n==0) f=1; else f=x*xn(x,n-1); return (f); } void main( ) { int n,x; long y; scanf(%d,%d,&x,&n); y=xn(x,n); printf(%ld\n,y); } 程序运行情况如下: 2,10 ? 1024 35/73 Hanoi( 汉诺塔问题) A B C