5 函数(二) 5.1 基本知识 5.2 函数重载 5.3 示例 5.4 变量的作用域和生命期 5.5 编译预处理 5.6 递归函数.

Slides:



Advertisements
Similar presentations
因数与倍数 2 、 5 的倍数的特征
Advertisements

摆一摆,想一想. 棋子个数数的个数 摆出的数 、 10 2 、 11 、 20 3 、 12 、 21 、 30 4 、 13 、 22 、 31 、 40 5 、 14 、 23 、 32 、 41 、
3 的倍数特征 抢三十

3 的倍数的特征 的倍数有 : 。 5 的倍数有 : 。 既是 2 的倍数又是 5 的倍数有 : 。 12 , 18 , 20 , 48 , 60 , 72 , , 25 , 60 ,
第二节 换元积分法 一、第一类换元积分 法(凑微分法) 二、第二类换元积分法. 问题 解决方法 利用复合函数,设置中间变量. 过程令 一、第一类换元积分法(凑微分法)
2.3 函数的微分. 四川财经职业学院 课前复习 高阶导数的定义和计算方法。 作业解析:
3.5 元 / 千克 2.6 元 / 千克 买 3 千克 要多少钱? = (元)
冀教版四年级数学上册 本节课我们主要来学习 2 、 3 、 5 的倍数特征,同学们要注意观察 和总结规律,掌握 2 、 3 、 5 的倍 数分别有什么特点,并且能够按 要求找出符合条件的数。
河內塔(Hanoi)問題.
親愛的老師您好 感謝您選用本書作為授課教材,博碩文化準備本書精選簡報檔,特別摘錄重點提供給您授課專用。 說明: 博碩文化:
2011年10月31日是一个令人警醒的日子,世界在10月31日迎来第70亿人口。当日凌晨,成为象征性的全球第70亿名成员之一的婴儿在菲律宾降生。 ?
计算学科的基本问题 本章首先介绍一个对问题进行抽象的典型实例——哥尼斯堡七桥问题。然后,通过“梵天塔”问题和“停机问题”分别介绍学科中的可计算问题和不可计算问题。从“梵天塔”问题再引出算法复杂性中的难解性问题、P类问题和NP类问题,证比求易算法,P=NP是否成立的问题。
9 有理数的乘方.
不会宽容人的人, 是不配受到别人的宽容的。 贝尔奈.
复习回顾 a a×a a×a×a a a×a×a= a×a= 1.如图,边长为a厘米的正方形的面积 为 平方厘米。
2.2.1 等比数列的概念和通项公式.
初级会计实务 第八章 产品成本核算 主讲人:杨菠.
第三章 函数逼近 — 最佳平方逼近.
神奇的宇宙 我们的太阳系 宇宙中天体有哪些类型? 刊号:CN77-87 编辑: 施雅苑 今日一叠4版 第1期 认识宇宙 16岁的哈勃
中考阅读 复习备考交流 西安铁一中分校 向连吾.
中央广播电视大学开放教育 成本会计(补修)期末复习
《高等数学》(理学) 常数项级数的概念 袁安锋
人教版义务教育课程标准实验教科书 小学数学四年级上册第七单元《数学广角》 合理安排时间 248.
第四章 时间序列的分析 本章教学目的:①了解从数量方面研究社会经济现象发展变化过程和发展趋势是统计分析的一种重要方法;②掌握时间数列编制的基本要求;③理解和掌握水平速度两方面指标的计算及运用④理解和掌握长期趋势分析和预测的方法。 本章教学重点:现象发展的水平指标和速度指标。 本章教学难点:现象变动的趋势分析。
第5章 定积分及其应用 基本要求 5.1 定积分的概念与性质 5.2 微积分基本公式 5.3 定积分的换元积分法与分部积分法
中考语文积累 永宁县教研室 步正军 2015.9.
小学数学知识讲座 应用题.
倒装句之其他句式.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
建立作业“新常规” 区教学研究室 徐和平.
阅读p48等比数列 等比数列 ——乌海市第十中学高二数学组.
等差数列的应用 虎山中学高一文科备课组 黄小辉.
第 22 课 孙中山的民主追求 1 .近代变法救国主张的失败教训: “师夷之长技以制 夷”“中体西用”、兴办洋务、变法维新等的失败,使孙中山
函數(一) 自訂函數、遞迴函數 綠園.
Chap 10 函数与程序结构 10.1 函数的组织 10.2 递归函数 10.3 宏定义 10.4 编译预处理.
第七章 函数 目录 有参的加法函数的开发 函数定义的一般形式 函数参数和函数的值 函数的调用
走进编程 程序的顺序结构(二).
第八章 函数.
第六讲栈和队列(一)增加 1/13.
Cyclic Hanoi问题 李凯旭.
动态规划(Dynamic Programming)
C Programming in Action
东北林业大学 陈宇 ACM程序设计 东北林业大学 陈宇
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
计算.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
費波那契 606 蕭楚恒.
数列.
专题作业.
作业情况 已交作业人数:140人 凡是自己没有交过作业的同学,课后留下,有话要说。 2. 文件名范例: 姓名:王树武 wshw_1.c
概 率 统 计 主讲教师 叶宏 山东大学数学院.
11.1 递归的定义 11.2 常见递归问题 11.3 递归的实现 11.4 递归转化为非递归的一般过程 11.5 递归的时间和空间复杂度
离散数学─归纳与递归 南京大学计算机科学与技术系
1、递归的概念 2、递归函数的设计 3、递归过程与递归工作栈 4、例 5、递归过程的非递归化
第4章 Excel电子表格制作软件 4.4 函数(一).
資料結構與C++程式設計進階 遞迴(Recursion) 講師:林業峻 CSIE, NTU 6/ 17, 2010.
參數 實際參數(Actual parameter)與形式參數(Formal parameter)
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
第八节 算术运算符和算术表达式.
本节内容 C语言的汇编表示 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
2019/5/20 第三节 高阶导数 1.
遞迴 Recursion.
任选四个不同的数字,组成一个最大的数和一个最小的数。用最大的数减去最小的数。用所得结果的四位数重复上述过程,最多七步,必得6174
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
§12-5 同方向同频率两个简谐振动的合成 一. 同方向同频率的简谐振动的合成 1. 分振动 : 2. 合振动 : 解析法
畢氏定理(百牛大祭)的故事 張美玲 製作 資料來源:探索數學的故事(凡異出版社).
顺序结构程序设计 ——关于“字符串”和数值.
第二次课后作业答案 函数式编程和逻辑式编程
102年人事預算編列說明 邁向頂尖大學辦公室製作.
Presentation transcript:

5 函数(二) 5.1 基本知识 5.2 函数重载 5.3 示例 5.4 变量的作用域和生命期 5.5 编译预处理 5.6 递归函数

1、什么是递归 2、递归函数举例 3、课堂讨论 4、斐波那契(Fibonacci) 数列 5、Hanoi塔问题

一个哄小宝宝睡觉前讲的经典故事: 从前有座山,山里有座庙,庙里有个老和尚,在给小和尚讲故事。讲的什么故事呢?从前有座山,山里有座庙,庙里有个老和尚,在给小和尚讲故事。讲什么故事呢?从前有座山,山里有座庙,庙里有个老和尚,在给小和尚讲故事。讲的什么故事呢?从前有座山,山里有座庙,庙里有个老和尚,在给小和尚讲故事。。。。。。

1、什么是递归 什么是递归:函数调用了自身(直接递归)。或一个函数调用了另一个函数,而另一个函数却调用了本函数(间接递归)。 从问题求解的角度来看,递归的本质就是将大问题的求解转化为较小问题的求解。持续不断的分解过程最终将问题化简成一个最基本的形式,并且是一个已知解。

2、递归函数举例 例:求N! int fact(int n) { if (n==1 || n==0) return 1; else return n*fact(n-1); }

例:求最大公约数的2个版本 int gcd(int a, int b)//递归版 { if(a%b==0) return b; else return gcd(b, a%b); } 迭代法是用计算机解决问题的一种基本方法。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。 int gcd(int a, int b)//迭代版 { while(b!=0){ int t=a%b; a=b; b=t; } return a;

3、课堂讨论 问题一:已知每个同学的期中考试成绩,如何求出全班最高分? 方法二? 方法一? 方法三?

问题二:如何编程实现ab? 方法二? 二分法 方法一? 常规法 要点: a10 = a5*a5 ; a11 = a5*a5*a

4、斐波那契(Fibonacci) 数列 斐波那契(Leonardo Fibonacci,约1170-约1250),意大利数学家,12、13世纪欧洲数学界的代表人物。 他的一个“兔子问题”引起了后人的极大兴趣。题目假定一对大兔子每一个月可以生一对小兔子,而小兔子出生后两个月就有生殖能力,问从一对小兔子开始,n年后能繁殖成多少对兔子?这导致“斐波那契数列”:1,1,2,3,5,8,13,21,…,其规律是每一项(从第3项起)都是前两项的和。

问题:求fibonacci数列前40个数。数列第1,2两个数为1,1。从第3个数开始,该数是其前面两个数之和。即: f1=1 (n=1) f2=1 (n=2) fn=fn-1+fn-2 (n>2)

时间(月)  初生兔子(对) 成熟兔子(对)  兔子总数(对)  1 1 0 1 2 0 1 1 3 1 1 2 4 1 2 3 5 2 3 5 6 3 5 8 7 5 8 13 8 8 13 21 9 13 21 34 10 21 34 55 若把兔子总数(对)继续写下去,得到的数列便称为斐波那契数列。数列中每个数便是前两个数之和,而数列的最初两个数都是1。 数学上,一般设F0=1, F1=1;当n>1时, Fn=Fn-1+Fn-2 。

求解斐波那契数列(迭代法) int fib(int n) { if(n<2) return 1; int f0=1,f1=1,f2; for(int i=2; i<=n; i++) f2=f0+f1; f0=f1; f1=f2; } return f2; 利用数组保存所有可能的结果,避免每次重新求解可提高效率。 PreProcess(a,40); 结果存入数组a while(cin>>n){ cout<<a[n]<<endl; } int main(){ int n; while(cin>>n){ cout<<fib(n)<<endl; } return 0;

求解斐波那契数列(递归法) int fib(int n) { if(n<2) return 1; else return fib(n-1)+fib(n-2); }

知道黄金分割率吗? 当斐波那契数列趋向于无穷大时,相邻两项的比值趋向于黄金分割0.618。 课后建议:百度百科 - 斐波那契数列http://baike.baidu.com/view/816.htm 课后建议:百度百科 -计算思维 http://baike.baidu.com/view/3053744.htm?fr=aladdin

斐波那契螺旋线

递增的牛群(HLoj 1190) 开始有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?

C1=1, C2=2, C3=3, C4=4, C5=6,... 且,当n>3时,Cn = Cn-1 + Cn-3。 时间(年)  小牛 中牛 大牛  总数  1 0 0 1 1 2 1 0 1 2 3 1 1 1 3 4 1 1 2 4 5 2 1 3 6 6 3 2 4 9 7 4 3 6 13 8 6 4 9 19 9 9 6 13 28 10 13 9 19 41 数列特点: C1=1, C2=2, C3=3, C4=4, C5=6,... 且,当n>3时,Cn = Cn-1 + Cn-3。

求解递增的牛群(递归法) int Cows(int n) { if(n<4) return n; else return Cows(n-1)+Cows(n-3); }

5、 Hanoi塔问题 设A、B、C是三个塔座。开始时,在塔座A上有一叠共n个圆盘,这些圆盘自下而上,由大到小地叠在一起,如后图所示。现在要求将塔座A上的这一叠圆盘移到塔座B上,并仍按同样顺序叠置。在移到圆盘时应遵守以下移动规则: 规则(1):每次只能移动一个圆盘; 规则(2):任何时刻都不允许将较大的圆盘压在较小的圆盘之上; 规则(3):在满足移动规则(1)和(2)的前提下,可将圆盘移至A,B,C中任何一塔座上。

问题分析 设an表示从塔座A上的n个圆盘全部转移到另一根柱子上的转移次数。显然,a1 =1。当n≥2时,要将塔座A上的n个圆盘全部转移到塔座B上,可以这样设想: 先把塔座A上的 n-1个圆盘想法转移到塔座C上,这需要转移an-1次,然后把塔座A上的最后一个大圆盘转移到塔座B上,显然这需要转移1次,最后再把塔座C上的 n-1个圆盘转移到塔座B上,这也需要转移an-1 次。经过这些步骤后,所有塔座A上的n个圆盘就全部转移到塔座B上。根据加法规则,一共转移了2an-1 +1次。 可以建立如下的递归关系:

计算总的移动次数的递推公式如下 a1=1 an=2an-1+1 (n>1) 求解递推关系式,可得 an=2n-1                

// 求解hanoi 搬动过程的 参考代码 void move(char get, char put) { cout<<get<<"-->"<<put<<endl; } // 递归函数 void hanoi(int n, char from, char to, char by) if(n==1) move(from,to); else hanoi(n-1,from,by,to); hanoi(n-1,by,to,from); int main() { int n; cin>>n; // move n diskes From A To B By C hanoi(m,'A', 'B', 'C'); return 0; }

相关练习题 请使用递归法解决下列问题: 1111 判断回文串 1164 数字和 1190 母牛的故事 5017 最小公倍数 5018 求最大值 5020 求N! 6061 整数转换成字符串 6064 编写递归函数Ack(m,n) 6201 数组程序设计1