第8章第6节 §86函数的递归调用 概念 在函数调用过程中出现调用该函数本身。即:函数的自我调用。 如 int f(int x) int fl(int int f2 (intt) Rint y, z; Rint y, z; Rint a, c; f(y); Z2(y) fl(y return(z) return(z; return(c); 直接调用 间接调用 在实际应用中,函数的递归调用解决的主要问题 1己知:[前一项(-1)与后一项()的某种关系 边界条件(如:初始条件,始止条件等) 2.求:其中某一项的值
第8章第6节 §8.6 函数的递归调用 一.概念 在函数调用过程中,出现调用该函数本身。即:函数的自我调用。 如: int f(int x) {int y,z; ...... z=f(y); ...... return(z); } int f1(int x) {int y,z; ...... z=f2(y) ...... return(z); } int f2(int t) {int a,c; ...... z=f1(y) ...... return(c); } 直接调用 间接调用 在实际应用中,函数的递归调用解决的主要问题 1.己知: 前一项(n-1)与后一项(n)的某种关系 边界条件(如:初始条件,始止条件等) 2 . 求: 其中某一项的值
第8章第6节 例:有一组数,其中A5比A4大2,A4比AB3大2,……2比A1大2, A[=-10,求A5 解: 各项的关系:A5|=A4+2,A4=A3]+2,…A|2|=A+2 边界条件:A[1=10 递推公式A∫10 n A[n-1]+2 求解过程 两个阶段:1.“回推”2.“递推” A|5] A[5 A4+×A4 18 A[4 A|3+2 A|3 AB316 A[2l+2 14 回推 A[2] A[2 递推(回代) A[1]+2 12 A[I=10
第8章第6节 例: 有一组数,其中A[5]比A[4]大2, A[4]比A[3]大2,…... A[2]比A[1]大2, A[1]=10,求A[5]。 解: 各项的关系: A[5]=A[4]+2, A[4]=A[3]+2,…. A[2]=A[1]+2。 边界条件: A[1]=10 10 n=1 递推公式 A[n-1]+2 n>1 求解过程 两个阶段: 1. “回推” 2. “递推” A[4] A[3]+2 A[3] A[2]+2 A[5] A[4]+2 A[2] A[1]+2 A[1]=10 A[5] 18 A[3] 14 A[4] 16 A[2] 12 回推 递推(回代) A[n]=
第8章第6节 程序: int f(int n) fint c; if(n=1)c=10: 终止条件 else c=f(n-1)+2 函数自我调用 return c; inO fint f(int n) 函数声明(可省 printf(“ resulte Al!Sl=%d”,f(5); 略) 函数调用
第8章第6节 程序 : int f(int n) {int c; if (n==1) c=10; else c=f(n-1)+2; return c; } main() {int f(int n); printf(“ resulte A[5]=%d”,f(5)); } 函数自我调用 终止条件 函数调用 函数声明(可省 略)
maind 上一题的分析 int f(int n); printf(" resulte A[5=%d, f(5);3 18 第一次调用 int f(int n if n )c=10; 注意:函数调用的次序。函数 ls f(n-1)+2; 调用完毕后,回到上一步的调 第二次调用m;}4|16 用点处。 f(i if(n=1)c=10 else c=f(n-1)+2; return 第三次调用 c;}3↑14 int f(int n) ir(m=+1)c=10 else c=f(n-1)+2; 第四次调用 return c; 12 int f(int h) 第五次调用 int if(m=+1)c=10 int f(int f(n-1)+2; Int c; return c;}1↑10 if(m=1)c=10; 第五次调用 Ise c=f(n-1)+2 return c;
main() 上一题的分析 {int f(int n); printf(“ resulte A[5]=%d”,f(5));} int f(int n) {int c; if (n==1) c=10; else c=f(n-1)+2; return c; } int f(int n) {int c; if (n==1) c=10; else c=f(n-1)+2; return c; } 4 int f(int n) {int c; if (n==1) c=10; else c=f(n-1)+2; return c; } int f(int n) {int c; if (n==1) c=10; else c=f(n-1)+2; return c; } 3 2 int f(int n) {int c; if (n==1) c=10; else c=f(n-1)+2; return c; } 1 1 10 10 12 14 16 18 5 注意: 函数调用的次序。函数 调用完毕后,回到上一步的调 用点处。 第一次调用 第二次调用 第三次调用 第四次调用 第五次调用 第五次调用
第8章第6节 六函数递归调用应注意的两点 1.函数自我调用 大多数问题可按这两点直接套用 2.终止条件 例4P120610猴子吃桃子的问题 解 桃子:15347663821909446221041 规律:前一天的桃子数=(后一天的桃子数+1)×2 程序:法一:用循环直接计算 maine Rint i, num=l for(i=10; il; i--) num=(num+1)*2 print(“num=%dm”,num);
大多数问题可按这两点直接套用 ****函数递归调用应注意的两点**** 1. 函数自我调用 2. 终止条件 例4 P120 6.10 猴子吃桃子的问题 解: 桃子: 1534 766 382 190 94 46 22 10 4 1 规律: 前一天的桃子数=(后一天的桃子数+1)×2 程序: 法一:用循环直接计算 main() {int i,num=1; for(i=10;i>1;i--) num=(num+1)*2; printf(“num=%d\n”,num); } 第8章第6节