c语言--函数的递归调用 ppt课件
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
main() { int n; scanf("%d",&n); hanoi(n,‘A',‘B',‘C'); }
12
PPT课件
13
第五章 函数
运行情况如下:
input the number of diskes:3 The step to moving 3 diskes: A >C A >B
…… return(2*z) ; }
int f1(x)
int x ; { int y, z ;
……
z =f2(y) ;
…… return(2*z) ; }
int f2(t)
int t ; { int a, c ;
……
c =f1(a) ;
…… return(3+c) ; }
说明
C语言对递归函数的自调用次数没有限制
6
PPT课件
7
第五章 函数
设 age 表示年龄,则有如下:
age(5) =age(4)+2
age(n) =
age(4) =age(3)+2
10
(n=1)
age(n-1)+2 (n>1)
age(5) =16+2=18
age(4) =14+2=16
age(3) =age(2)+2
age(3) =12+2=14
16
PPT课件
age(2) =age(1)+2
age(2) =10+2=12
age(1) =10
7
PPT课件
8
main() {
printf(“%d”, age(5)); }
第五章 函数
age(int n) { int c;
if(n==1) c=10; else c = age(n-1)+2; return(c) ; }
14
PPT课件
15
小
第五章 函数
结
本节课主要介绍的内容: 1. 函数递归的定义 2. 函数递归的特点 3.函数递归调用的方式
15
PPT课件
16
第五章 函数
1
(n=10)
上机作业:num(n)= 2* (num(n+1)+1) (n<10)
说有一只调皮的小猴子,摘了一堆水果,第一天 吃了水果的一半,又多吃了一个;第二天吃了剩 下水果的一半,又多吃了一个;依次类推….到第 十天,发现只剩下了10个水果,请问这只猴子到 底摘了多少个水果?
1
第五章 函数
张福祥 主编
辽宁大学出版社
1
PPT课件
2
第五章 函数
我们先看这样一个例子:
说有一只调皮的小猴子,摘了一堆水果,第一天 吃了水果的一半,又多吃了一个;第二天吃了剩 下水果的一半,又多吃了一个;依次类推….到第 十天,发现只剩下了1个水果,请问这只猴子到 底摘了多少个水果?
2
PPT课件
C >B A >C B >A B >C A >C
13
PPT课件
14
第五章 函数
在程序中有两个函数:
move (getone, putone) 表示从getone 塔移一个盘子至putone塔
hanoi(n, one, two, three) 表示n个盘子从one塔借助于two塔(空)移 至three塔,调用时塔用字符常量'A' ,' B ', ' C '表示。
3
第五章 函数
5.4 函数递归调用
许一多、数函学数函递数都归是的用特递点归的形式定义的:
1、定1义:调用一(n个 0函,1)数时直接或间接调用自身, n! n (n 1称)! 之为(函n 数1) 的递归。
2、一个问题能够成为递归必须具备的条件是:
xn
1
x
x n 1
(n 0)
10
PPT课件
例11 Hanoi问题
第五章 函数
A
B
C
11
PPT课件
12
程序如下:
A
B
C
A
B
C
A
B
C
A
B
C
第五章 函数
void move(char getone, char putone) {printf("%c--->%c\n",getone,putone); }
void hanoi(int n,char A,char B,char C) { if(n==1) move(A,C); else { hanoi(n-1,A,C,B); move(A,C); hanoi(n-1,B,A,C);} }
后(n 一0)部分与原始问题类似
后一部分是原始问题的简化
3
PPT课件
4
二、程序中的递归方式
第五章 函数
1. 直接递归调用:函数直接调用本身 2. 间接递归调用:函数间接调用本身
4
PPT课件
5 直接调用
第五章 函数 间接调用
int f(x)
int x ; { int y, z ;
……
z =f(y) ;
时,保证三个塔始终是大盘在下,小盘在上,
并且每次只能移动一个盘子。
A
B
C
n个盘子
9
PPT课件
10
第五章 函数
必须用递归方式解决
1) 先将A塔n –1个盘子借助于C移至B上
2) 将A上剩下的一个移至C上.
Βιβλιοθήκη Baidu
3) 将B上n –1个盘子借助于A移至C上.
可以看到: 1)、3)为同一问题,都为n –1个盘子借助于一个 空塔移至另一塔上。
age(5)
n=5
n=4
n=3
n=2
n=1
c=age(4)+2 c=age(3)+2 c=age(2)+2 c=age(1)+2 c=10
c=16+2=18 c=14+2=16 c=12+2=14 c=10+2=12
8
PPT课件
9
例2: 汉诺塔(Hanoi)问题
第五章 函数
问题: 将A塔上n个盘子移至C(借助于B)。 移动
必须有递归结束条件
5
PPT课件
6
第五章 函数
思考如下问题:
例1: 有5个人坐在一起,问第5个人多少岁,
他说比第4个人大2岁;问第4个人岁数,他说比 第3个人大2岁;问第3个人,又说比第2个大2岁; 问第2个人,说比第1个人大2岁;最后问第1 个人,他说他10岁;请问第5个人多大?
我10岁
比她大2岁
12
PPT课件
13
第五章 函数
运行情况如下:
input the number of diskes:3 The step to moving 3 diskes: A >C A >B
…… return(2*z) ; }
int f1(x)
int x ; { int y, z ;
……
z =f2(y) ;
…… return(2*z) ; }
int f2(t)
int t ; { int a, c ;
……
c =f1(a) ;
…… return(3+c) ; }
说明
C语言对递归函数的自调用次数没有限制
6
PPT课件
7
第五章 函数
设 age 表示年龄,则有如下:
age(5) =age(4)+2
age(n) =
age(4) =age(3)+2
10
(n=1)
age(n-1)+2 (n>1)
age(5) =16+2=18
age(4) =14+2=16
age(3) =age(2)+2
age(3) =12+2=14
16
PPT课件
age(2) =age(1)+2
age(2) =10+2=12
age(1) =10
7
PPT课件
8
main() {
printf(“%d”, age(5)); }
第五章 函数
age(int n) { int c;
if(n==1) c=10; else c = age(n-1)+2; return(c) ; }
14
PPT课件
15
小
第五章 函数
结
本节课主要介绍的内容: 1. 函数递归的定义 2. 函数递归的特点 3.函数递归调用的方式
15
PPT课件
16
第五章 函数
1
(n=10)
上机作业:num(n)= 2* (num(n+1)+1) (n<10)
说有一只调皮的小猴子,摘了一堆水果,第一天 吃了水果的一半,又多吃了一个;第二天吃了剩 下水果的一半,又多吃了一个;依次类推….到第 十天,发现只剩下了10个水果,请问这只猴子到 底摘了多少个水果?
1
第五章 函数
张福祥 主编
辽宁大学出版社
1
PPT课件
2
第五章 函数
我们先看这样一个例子:
说有一只调皮的小猴子,摘了一堆水果,第一天 吃了水果的一半,又多吃了一个;第二天吃了剩 下水果的一半,又多吃了一个;依次类推….到第 十天,发现只剩下了1个水果,请问这只猴子到 底摘了多少个水果?
2
PPT课件
C >B A >C B >A B >C A >C
13
PPT课件
14
第五章 函数
在程序中有两个函数:
move (getone, putone) 表示从getone 塔移一个盘子至putone塔
hanoi(n, one, two, three) 表示n个盘子从one塔借助于two塔(空)移 至three塔,调用时塔用字符常量'A' ,' B ', ' C '表示。
3
第五章 函数
5.4 函数递归调用
许一多、数函学数函递数都归是的用特递点归的形式定义的:
1、定1义:调用一(n个 0函,1)数时直接或间接调用自身, n! n (n 1称)! 之为(函n 数1) 的递归。
2、一个问题能够成为递归必须具备的条件是:
xn
1
x
x n 1
(n 0)
10
PPT课件
例11 Hanoi问题
第五章 函数
A
B
C
11
PPT课件
12
程序如下:
A
B
C
A
B
C
A
B
C
A
B
C
第五章 函数
void move(char getone, char putone) {printf("%c--->%c\n",getone,putone); }
void hanoi(int n,char A,char B,char C) { if(n==1) move(A,C); else { hanoi(n-1,A,C,B); move(A,C); hanoi(n-1,B,A,C);} }
后(n 一0)部分与原始问题类似
后一部分是原始问题的简化
3
PPT课件
4
二、程序中的递归方式
第五章 函数
1. 直接递归调用:函数直接调用本身 2. 间接递归调用:函数间接调用本身
4
PPT课件
5 直接调用
第五章 函数 间接调用
int f(x)
int x ; { int y, z ;
……
z =f(y) ;
时,保证三个塔始终是大盘在下,小盘在上,
并且每次只能移动一个盘子。
A
B
C
n个盘子
9
PPT课件
10
第五章 函数
必须用递归方式解决
1) 先将A塔n –1个盘子借助于C移至B上
2) 将A上剩下的一个移至C上.
Βιβλιοθήκη Baidu
3) 将B上n –1个盘子借助于A移至C上.
可以看到: 1)、3)为同一问题,都为n –1个盘子借助于一个 空塔移至另一塔上。
age(5)
n=5
n=4
n=3
n=2
n=1
c=age(4)+2 c=age(3)+2 c=age(2)+2 c=age(1)+2 c=10
c=16+2=18 c=14+2=16 c=12+2=14 c=10+2=12
8
PPT课件
9
例2: 汉诺塔(Hanoi)问题
第五章 函数
问题: 将A塔上n个盘子移至C(借助于B)。 移动
必须有递归结束条件
5
PPT课件
6
第五章 函数
思考如下问题:
例1: 有5个人坐在一起,问第5个人多少岁,
他说比第4个人大2岁;问第4个人岁数,他说比 第3个人大2岁;问第3个人,又说比第2个大2岁; 问第2个人,说比第1个人大2岁;最后问第1 个人,他说他10岁;请问第5个人多大?
我10岁
比她大2岁