- 1、本文档共27页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Hanoi问题 Hanoi问题 递归与迭代 课后作业 课本P202:8.13,8.17 分治法的基本思想 * * 第3讲函数的递归调用 本讲内容: (1)递归函数的定义与调用 (2) 汉诺塔问题 (3)分治法的基本思想 (4)二分搜索技术 递归的概念 递归函数:直接调用自己或通过另一函数间接调用 自己的函数 用递归求解问题的特点 (1) 存在递归的终止条件 (2) 存在导致问题求解的递归方式 1 n=0,1 n*(n-1)! n0 n!= 递归的终止条件 递归公式 例: 用递归的方法求n! 1 n=0,1 n*(n-1) ! n1 n!= 递归的终止条件 递归方式 4!=4*(4-1)! 返回值6 返回值2 返回值1 3!=3*(3-1)! 2!=2*(2-1)! 1!=1 主调函数 返回值24 调用 #include stdio.h float fac( int n ) ; void main( ) { int m ; float y ; scanf(“%d”, m ); y=fac(m); /*调用函数fac ()*/ printf(“%d!=%15.0f \n”, m , y ) ; } 函数声明 递归调用 函数定义 float fac(int n) { float f ; if ( n0 ) { printf(“error!”); f=-1; } else if (n==0 || n==1 ) f=1; else f=n*fac( n-1 ) ;/*递归调用自己*/ return(f ) ; } main函数 输入m ③ y=fac(m) 输出y ⑥ 调用fac m?n ③ 因 3!=0,1 f=3*fac(3-1) 返回f ⑥ 调用fac m?n ② 返回f ② 返回f ① 因 2!=0,1 f=2*fac(2-1) 调用fac m?n ① 因1==1 f=1 结束 递归调用过程: 递归法求Fibonacci数列 Fibonacci数列: 1, 1, 2, 3, 5, 8, 13… 迭代法求Fibonacci数列的前20项 #include stdio.h void main( ) { int i , f1=1 , f2=1 , f3; printf(“%8d%8d”, f1 , f2); for ( i=3 ; i=20 ; i++ ) { f3=f1+f2; f1=f2; f2=f3; printf(“%8d”, f3); if ( i%4==0) putchar(‘\n’); } } 迭代法在已知数列前2项的基础上, 从第3项开始, 依次向后计算, 得出数列的每一项 思考:怎样用递归的方法求解? 定义Fibonacci数列的递归数学模型: 递归法求Fibonacci数列 1 n=0,1 F(n-1)+F(n-2) n1 F(n)= 递归的终止条件 递归公式 int Fib(int n) { if (n0) { printf(“error!”); exit(-1); } else if (n = 1) return 1; else return Fib(n-1)+Fib(n-2); } 递归法求Fibonacci数列 用递归法求Fibonacci数列 Fib(4) return + Fib(3) Fib(2) return + Fib(1) Fib(0) return + Fib(2) Fib(1) return + Fib(1) Fib(0) return 1 return 1 return 1 return 1 return 1 递归法是从第n项开始向前计算, 当n等于0或1时结束递归调用,开始返回 1 1 2 1 1 1 2 3 5 n=20时, 要进行21891次递
文档评论(0)