1、假设欲计算出 13*4,则:13 * 4 = 13 + ( 13 * 3 )= 13 + ( 13 + ( 13 * 2 ) )= 13 + ( 13 + ( 13 + ( 13 * 1 ) ) )= 13 + ( 13 + ( 13 + 13 ) )= 13 + ( 13 + 26 )= 13 + 39 = 52程序源代码:010203040506070809101112131415161718192021222324252627282930313233343536373839/* = Program Description =*/* 程序名称: multiply.c */* 程序目的: 设
2、计一个可计算两数相乘,但仅用加法运算, */* 不使用乘法运算的程序。 */* Written By (WANT Studio.) */* = */* - */* 递归乘法运算 */* - */int Multiply(int M,int N)int Result; /*运算结果*/if ( N = 1)Result = M; /* 递归结束条件 */ElseResult = M + Multiply(M,N-1); /* 递归执行部分 */return Result;/* - */* 主程序 */* - */void main ()int NumA; /* 乘数变量 */int NumB;
3、/* 被乘数变量 */int Product; /* 乘积变量 */printf(“Please enter Number A:“);/* 输入乘数 */scanf(“%d“,printf(“Please enter Number B:“);/* 输入被乘数 */scanf(“%d“,Product = multiply(NumA,NumB);printf(“%d * %d = %d“,NumA,NumB,Product);运行结果:C:DSmultiplyPlease enter Number A:13Please enter Number B:413 * 4 = 52C:DS数据结构140
4、我们由题意可知每次执行的过程相似,唯一的不同点为其中一个传入参数,每次执行都递减。递归结束条件为当被乘数为 1 时返回乘数的值。否则继续调用程序并递减传入被乘数值。其结构如下:int Multiply(int M,int N)int Result;if ( N = 1)Result = M; /* 递归结束条件( Stopping Case) */elseResult = M + Multiply(M,N-1); /* 递归执行部分( Recursive Step) */return Result;处理递归问题,常采用 if 语句来判断是否符合递归结束条件,其算法格式如下:if (符合递归结束
5、条件) then返回 答案else使用递归将程序分割为更简单的小程序。在 C 语言中,我们采用堆栈这个数据结构来记录函数调用后的返回地址。例如有一个程序如下:int ProcedureA () /* 子程序 A */ProcedureB(); /* 调用子程序 B */ /* 返回地址 2 */int ProcedureB() /* 子程序 B */void main () /* 主程序 */ProcedureA(); /* 调用子程序 A */ /* 返回地址 1 */第 6 章 递归 141程序源代码:01020304050607080910111213141516171819202122
6、23242526272829303132333435/* = Program Description = */* 程序名称: reverse.c */* 程序目的: 运用递归设计一个将字符串反转的程序。 */* Written By . (WANT Studio.) */* = */char String30; /* 声明字符串变量 */int Length; /* 字符串长度变量 */* - */* 递归字符串反转 */* - */void Reverse(int N)if ( N reversePlease enter string : ABCThe reverse string : CB
7、AC:DS程序源代码:01020304050607/* = Program Description = */* 程序名称: factor.c */* 程序目的: 运用递归设计一个做阶乘运算的程序。 */* Written By . (WANT Studio.) */* =*/* - */数据结构142080910111213141516171819202122232425262728293031/* 递归阶层运算 */* - */int Factor(int N)if ( N factorPlease enter a number : 77! = 5040C:DS程序源代码:010203040
8、50607080910111213141516171819202122/* = Program Description =*/* 程序名称: gcd.c */* 程序目的: 运用递归设计一个求两数之最大公因子的程序 */* Written By. (WANT Studio.) */* =*/* - */* 递归求最大公因子 */* - */int GCD(int M,int N)if (N = 0) /* 递归结束条件 */return M;elsereturn GCD(N,M % N); /* 递归执行部分 */* - */* 主程序 */* - */void main ()第 6 章 递归
9、 14323242526272829303132333435int NumberA; /* 运算数值变量 */int NumberB; /* 运算数值变量 */int Result; /* 运算结果变量 */printf(“The Great Common Divisor of Number A, Number Bn“);printf(“Please enter number A : “); /* 输入数值 */scanf(“%d“,printf(“Please enter number B : “); /* 输入数值 */scanf(“%d“,Result = GCD(NumberA,Num
10、berB); /* 调用递归函式 */printf(“GCD(%d,%d) = %dn“,NumberA,NumberB,Result);运行结果:C:DSgcdThe Great Common Divisor of Number A, Number BPlease enter number A : 2545Please enter number B : 3155GCD(2545,3155) = 5C:DS程序源代码:010203040506070809101112131415161718192021222324252627282930/* = Program Description = */
11、* 程序名称: fib.c */* 程序目的: 运用递归设计一个求费氏级数的程序。 */* Written . (WANT Studio.) */* = */* - */* 递归求费氏级数 */* - */int Fib(int N)if (N fibThe Fibonacci NumbersPlease enter a number : 10Fibonacci Numbers of 10 = 55C:DS程序源代码:01020304050607080910111213141516171819202122232425262728293031323334353637383940/* = Prog
12、ram Description = */* 程序名称: comb.c */* 程序目的: 运用递归设计一个求组合公式的程序。 */* Written By . (WANT Studio.) */* = */* - */* 递归求组合公式 */* - */int Comb(int N,int M)if ( (N = M) | (M = 0) ) /* 递归结束条件 */return 1;else /* 递归执行部分 */return Comb(N-1,M) + Comb(N-1,M-1);/* - */* 主程序 */* - */void main ()int NumberN; /* 运算数值变
13、量 */int NumberM; /* 运算数值变量 */int Result; /* 运算结果变量 */printf(“The Combination Number of two Numbers.n“);printf(“Please enter number N: “); /* 输入数值 */scanf(“%d“,printf(“Please enter number M: “); /* 输入数值 */scanf(“%d“,if (NumberN = NumberM)Result = Comb(NumberN,NumberM); /* 调用递归函式 */printf(“Comb(%d,%d)
14、 = %dn“,NumberN,NumberM,Result);elseprintf(“Error: N combThe Combination Number of two Numbers.Please enter number N: 9Please enter number M: 3Comb(9,3) = 84C:DScombThe Combination Number of two Numbers.Please enter number N: 3Please enter number M: 9Error: N 程序源代码:0102030405060708091011121314151617
15、1819202122232425262728293031323334353637/* = Program Description = */* 程序名称: hanoi.c */* 程序目的: 运用递归来解汉诺塔问题。 */* Written By . (WANT Studio.) */* = */#include int Counter; /* 计数器变量 */* - */* 递归解汉诺塔问题 */* - */int Hanoi(char From,char To,char Auxiliary,int N)if ( N = 1 ) /* 递归结束条件 */Counter+; /* 计数器递增 *
16、/printf(“Step %d : “,Counter);printf(“Move disk 1 from peg-%c to peg-%c.n“,From,To);else /* 递归执行部分 */* 将目的桩和辅助桩交换 */Hanoi(From,Auxiliary,To,N-1);Counter+; /* 计数器递增 */printf(“Step %d : “,Counter);printf(“Move disk %d from peg-%c to peg-%c.n“,N,From,To);/* 将来源桩和辅助桩交换 */Hanoi(Auxiliary,To,From,N-1);/*
17、- */* 主程序 */* - */void main ()int Number; /* 铁盘数目变量 */数据结构14638394041424344454647484950515253545556char Source;char Destination;char Auxiliary;Counter = 0;printf(“The Tower of Hanoi program.n“);printf(“Please enter the number of disks : “);scanf(“%d“, /* 输入铁盘数 */printf(“The Source peg : “);Source =
18、getche(); /* 输入来源桩 */printf(“nThe Auxiliary : “);Auxiliary = getche(); /* 输入辅助桩 */printf(“nThe Destination : “);Destination = getche(); /* 输入目的桩 */printf(“n“);Hanoi(Source,Destination,Auxiliary,Number); /* 调用递归函数 */运行结果:C:DShanoiThe Tower of Hanoi program.Please enter the number of disks : 4The Sour
19、ce peg : AThe Auxiliary : BThe Destination : CStep 1 : Move disk 1 from peg-A to peg-B.Step 2 : Move disk 2 from peg-A to peg-C.Step 3 : Move disk 1 from peg-B to peg-C.Step 4 : Move disk 3 from peg-A to peg-B.Step 5 : Move disk 1 from peg-C to peg-A.Step 6 : Move disk 2 from peg-C to peg-B.Step 7 :
20、 Move disk 1 from peg-A to peg-B.Step 8 : Move disk 4 from peg-A to peg-C.Step 9 : Move disk 1 from peg-B to peg-C.Step 10 : Move disk 2 from peg-B to peg-A.Step 11 : Move disk 1 from peg-C to peg-A.Step 12 : Move disk 3 from peg-B to peg-C.Step 13 : Move disk 1 from peg-A to peg-B.Step 14 : Move di
21、sk 2 from peg-A to peg-C.Step 15 : Move disk 1 from peg-B to peg-C.C:DS程序源代码:0102030405060708/* = Program Description = */* 程序名称: queen.c */* 程序目的: 运用递归来解 N 皇后问题 */* Written . (WANT Studio.) */* = */char Chessboard88; /* 声明 8*8 的空白棋盘 */数据结构 14809101112131415161718192021222324252627282930313233343536
22、373839404142434445464748495051525354555657585960616263646566676869/* -*/* 递归解 N 皇后问题 */* -*/int N_Queens(int LocX,int LocY,int Queens)int i,j; /* 循环计数变量 */int Result=0;if ( Queens = 8 ) /* 递归结束条件 */return 1;else /* 递归执行部分 */if ( QueenPlace(LocX,LocY) )ChessboardLocXLocY = Q;for (i=0;i 0)break;if (Re
23、sult 0)return 1;elseChessboardLocXLocY = X;Return 0;elsereturn 0;/* - */* 判断传入坐标是否可放置皇后 */* - */int QueenPlace(int LocX,int LocY)int i,j;if (ChessboardLocXLocY != X) /* 判断是否有皇后 */return 0;for (j=LocY-1;j=0;j-) /* 判断上方是否有皇后 */if (ChessboardLocXj != X)return 0;for (j=LocY+1;j=0;i-) /* 判断左方是否有皇后 */if (
24、ChessboardiLocY != X)return 0;for (i=LocX+1;i=0 i = LocX + 1;j = LocY - 1;while ( i=0 ) /* 判断右上方是否有皇后 */if (Chessboardi+j- != X)return 0;i = LocX - 1;j = LocY + 1;while ( i=0 /* - */* 递归解迷宫问题 */* - */int Way(int LocX,int LocY)if ( Maze65 = 2 ) /* 递归结束条件 */return 1;else /* 递归执行部分 */if ( MazeLocYLocX
25、= 0 )MazeLocYLocX = 2;if ( Way(LocX,LocY-1) )return 1;else if ( Way(LocX+1,LocY-1) ) return 1;else if ( Way(LocX+1,LocY) ) return 1;else if ( Way(LocX+1,LocY+1) )return 1;else if ( Way(LocX,LocY+1) )return 1;else if ( Way(LocX-1,LocY+1) )return 1;else if ( Way(LocX-1,LocY) )return 1;else if ( Way(Lo
26、cX-1,LocY-1) )第 6 章 递归 1514344454647484950515253545556575859606162636465666768697071727374757677return 1;elseMazeLocYLocX = 3;return 0;elsereturn 0;/* - */* 主程序 */* - */void main ()int i,j; /* 循环计数变量 */printf(“=Problem of Maze =n“);printf(“The Maze source is (1,1).n“);printf(“The Maze Destination is
27、 (6,5).n“);Way(1,1);printf(“The graph of Maze.n“);printf(“ 0 1 2 3 4 5 6 n“);printf(“ +-+-+-+-+-+-+-+n“);for (i=0;imaze=Problem of Maze =The Maze source is (1,1).The Maze Destination is (6,5).The graph of Maze.0 1 2 3 4 5 6+-+-+-+-+-+-+-+0 |-1-|-1-|-1-|-1-|-1-|-1-|-1-|+-+-+-+-+-+-+-+1 |-1-|-2-|-1-|-
28、3-|-3-|-3-|-1-|+-+-+-+-+-+-+-+2 |-1-|-1-|-2-|-1-|-1-|-3-|-1-|+-+-+-+-+-+-+-+3 |-1-|-1-|-2-|-1-|-1-|-3-|-1-|+-+-+-+-+-+-+-+4 |-1-|-1-|-1-|-2-|-1-|-1-|-1-|+-+-+-+-+-+-+-+5 |-1-|-0-|-0-|-1-|-2-|-1-|-1-|+-+-+-+-+-+-+-+6 |-1-|-1-|-1-|-1-|-0-|-2-|-1-|+-+-+-+-+-+-+-+7 |-1-|-1-|-1-|-1-|-1-|-1-|-1-|第 6 章 递归
29、149+-+-+-+-+-+-+-+C:DS4. 有一个递归程序如下:int fact(int N)if (n=0)return 1;elsereturn N * fact(N-1);5. 有一个递归程序如下:int X(int N)if (N = 3)return 1;elsereturn X(N-2) + X(N-4) + 1;7. 有一个递归程序如下:int maze(int a,int b,int c)if (ab)return a;elsereturn c*maze(a/b,b,c) + (a % b);3. 假设有一数学函数如下:A(m,n) = n+1, m=0A(m,n) = A(m-1,1), m!=0 and n=0A(m,n) = A(m-1,A(m,n-1), otherwise