函数嵌套调用和递归调用
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
if ((n==1) || (n==2)) return 1; else return (fib(n-1)+fib(n-2)); }
main() {
int i; printf("\n"); printf(" %d",fib(20));
}
例4: 汉诺塔(Hanoi)问题
问题: 将A塔上n个盘子移至C(借助于B)。 移动时, 保证三个塔始终是大盘在下,小盘在上。
#include "stdio.h" void move(int n,char x,char y,char z) { if(n==1)
printf("%c-->%c\n",x,z); else { move(n-1,x,z,y); //n-1盘子已经到y上
printf("%c-->%c\n",x,z); move(n-1,y,x,z); // y上n-1盘子想办法放到z } }
函数定义
{ long factorial(int n); 形参
long factorial(int n) { long rtn=1;
int i; for(i=1;i<=n;i++) rtn*=i; return(rtn); }
long c1,c2;
c1=factorial(a); 函数调用
c2= factorial(b);
递归函数: 10 (n=1)
age(n)= age(n-1)+2 (n>1)
请看看单步运行的情况……
递归过程 age(int n) 跟踪分析: {
int c; if (n==1) c=10; else c=age(n-1)+2; return c; }
age(5)
age(4)
age(3)
age(1) c=10 return c;
return(c1+c2); 函数返回值
}
例 2求三个数中最大数和最小数的差值
#include <stdio.h> int dif(int x,int y,int z); int max(int x,int y,int z); int min(int x,int y,int z); void main() { int a,b,c,d;
A
B
C
n个盘子
必须用递归方式解决,将n阶问题转为n-1阶:
1) 先将A塔n –1个盘子借助于C移至B上: 2) 将A上剩下的一个移至C上.
3) 将B上n –1个盘子借助于A移至C上. 可以看到:
1)、3)为同一问题,都为n –1个盘子借助于 一个空塔移至另一塔上。 递归出口:n=1,此时A座上只有一个盘子,直 接将其移动到C座上即可。
c=10
age(2)
c=age(4)+2; c=age(3)+2; c=age(2)+2; c=age(1)+2;
return c;
c=18
return c;
c=16
return c;
c=14
return c;
c=12
main() {
int x;
x=age(3);
printf("%d",x); }
main() { int a,b,c;
scanf(“%d,%d”,&a,&b);
c= jc(a,b);
printf(“sum is %d",c); }
int jc(int k, int j) { int z,m,i,s=1;
z=sum(k, j); m= pf(z); for(i=1;i<=m;i++) s=s*i; return s; }
scanf("%d%d%d",&a,&b,&c); d=dif(a,b,c); printf("Max-Min=%d\n",d);
}
int dif(int x,int y,int z) { return max(x,y,z)-min(x,y,z); }
int max(int x,int y,int z) { int r;
int sum(int x, int y) { return (x+y); }
int pf ( int h) { return (h*h); }
6.9.1 函数的嵌套调用
§C语言中不允许嵌套的函数定义,各函数之 间是平行的,不存在上一级函数和下一级函数 的问题。 void print( )
{ putchar('*'); void prnline( int n) { int i; for(i=0;i<=n;i++) putchar('\n'); }
总结:递归算法
递归函数名f(参数x) { if (x==初值) //递归结束的条件
结果=…; else
结果=含f(x-1)的表达式;
main() { f(n) …
}
返回结果(return); }
f(1或者0) { f(0)== …)
}
f(n) { f(n-1) }
f(n-1) { f(n-2) }
文件包含编译预处理命令
long factorial(int n);
函数声明
main()
{ int n1,n2;
long a;
long sum(int a, int b);
scanf("%d,%d",&n1,&n2);
实参 a=sum(n1,n2); 函数调用 printf("a=%1d",a);
} long sum(int a,int b)
f(n-2) { f(n-3) }
例2:用递归算法计算n! n!=n*(n-1)! (n-1)!=(n-1) *(n-2)! ………………….. 5!=5*4! 4!=4*3! 3!=3*2! 2!=2*1! 1!=1
long jc(int n) { long k;
if(n==1) k=1; else k=n*jc(n-1); return k; }
A
B
C
A >C A >B C >B A >C B >A B >C A >C
练习
1、用递归方法求和:
1!+2!+3!+4!+5!…+n!
其中n的值由键盘输入。 2、有5个人,第5个人说他的钱是第4个人的2 倍还多100元,第4个人说他是第3个人的2倍还 多100,第3个人说他是第2个人的2倍还多100, 第2个人说他是第1个人的2倍还多100,第1个 人说他1000元。求第5个人有多少钱。
间接调用
int f1(int x) int f2(int t)
{ int y,z; { int a,c;
……
来自百度文库
……
z=f2(y);
c=f1(a);
…….
…….
return(2*z); return(3+c);
}
}
【例1】有5个人,第5个人说他比第4个人大2 岁,第4个人说他对第3个人大2岁,第3个人说 他对第2个人大2岁,第2个人说他比第1个人大 2岁,第1个人说他10岁。求第5个人多少岁。
main() {
int n; printf (" input the number of diskes " :); scanf("%d",&n); move(n,'a','b','c'); }
运行情况如下: input the number of diskes:3 A >C A >B C >B A >C B >A B >C A >C
r=x>y?x:y; return(r>z?r:z); }
int min(int x,int y,int z) { int r;
r=x<y?x:y; return(r<z?r:z); }
练习
g(x,y)=
f( x+y) 2
x+y
(x<=y)
f(x-y) 2
x+y
( x>y)
其中:f(t)=(1+e-t)/(1+et) 求result=g(2.5,3.4)。
}
§C语言允许在一个函数的定义中出现对另一个函数 的调用(使用)。这样就出现了函数的嵌套调用,即在 被使用函数中又调用其他函数。
main( )函 数
①
②
f1( )函 数
③
④
f2( )函 数
调 用 f1( )函 数 调 用 f2( )函 数
⑤
后续语句
后续语句
⑨
⑧
结束
⑦
⑥
返回
返回
#include <stdio.h> long sum(int a, int b);
练习
• 例:编写求组合数的函数。
Cmn
m! n!(m n)!
6.9.2 函数的递归调用
递归: 一个函数直接或间接地使用自身。 1. 直接递归调用:函数直接调用本身 2. 间接递归调用:函数间接调用本身
直接调用
int f(int x) { int y,z;
…… z=f(y); ……. return(2*z); }
age( int 1n ) {
int c; if (n==1) c=10;
return c; }
age( int n3 ) {
int c;
else c= age( n2 -1 ) +2
return c; }
age( int 2n ) {
int c;
else c=age( n1 -1 ) +2
return c; }
例3、用递归法计算Fibonacci序列的第20项。
f= 1
n=1或者n=2
f(n-1)+f(n-2) n>2
根据数学公式,很容易将n阶的问题转化成 n-1阶和n-2阶的问题,即:f(n)=f(n-1)+f(n-2), 递归出口:n=1或者n=2。
程序如下: #include "stdio.h" int fib(int n) {
通过分析,设计递归函数如下: 10 (n=1)
age(n)= age(n-1)+2 (n>1)
程序如下:
age( int n ) {
int c; if (n==1) c=10; else c=age(n-1)+2;
return c; } main() {
int x; x=age(5); printf("%d",x); }
《C语言程序设计》
学习内容: 函数的嵌套调用和递归调用
6.9 函数的嵌套调用和递归调用
引例
编程函数求解:
y=(x+y)2 ! 然后调用函数求解(2+3)2!以及(3+4)2! 要求:
1、首先编写求和函数,求解x+y的和。 2、编写函数求解(x+y) 的平方(x+y)2 3、编写函数求解(x+y)2!
main() {
long x; x=jc(6); printf("%ld",x); }
long jc(int n) { long k;
int i; for(i=1;i<=n;i++) k=k*i; return k; } main() { long x; x=jc(6); printf("%ld",x); }
main() {
int i; printf("\n"); printf(" %d",fib(20));
}
例4: 汉诺塔(Hanoi)问题
问题: 将A塔上n个盘子移至C(借助于B)。 移动时, 保证三个塔始终是大盘在下,小盘在上。
#include "stdio.h" void move(int n,char x,char y,char z) { if(n==1)
printf("%c-->%c\n",x,z); else { move(n-1,x,z,y); //n-1盘子已经到y上
printf("%c-->%c\n",x,z); move(n-1,y,x,z); // y上n-1盘子想办法放到z } }
函数定义
{ long factorial(int n); 形参
long factorial(int n) { long rtn=1;
int i; for(i=1;i<=n;i++) rtn*=i; return(rtn); }
long c1,c2;
c1=factorial(a); 函数调用
c2= factorial(b);
递归函数: 10 (n=1)
age(n)= age(n-1)+2 (n>1)
请看看单步运行的情况……
递归过程 age(int n) 跟踪分析: {
int c; if (n==1) c=10; else c=age(n-1)+2; return c; }
age(5)
age(4)
age(3)
age(1) c=10 return c;
return(c1+c2); 函数返回值
}
例 2求三个数中最大数和最小数的差值
#include <stdio.h> int dif(int x,int y,int z); int max(int x,int y,int z); int min(int x,int y,int z); void main() { int a,b,c,d;
A
B
C
n个盘子
必须用递归方式解决,将n阶问题转为n-1阶:
1) 先将A塔n –1个盘子借助于C移至B上: 2) 将A上剩下的一个移至C上.
3) 将B上n –1个盘子借助于A移至C上. 可以看到:
1)、3)为同一问题,都为n –1个盘子借助于 一个空塔移至另一塔上。 递归出口:n=1,此时A座上只有一个盘子,直 接将其移动到C座上即可。
c=10
age(2)
c=age(4)+2; c=age(3)+2; c=age(2)+2; c=age(1)+2;
return c;
c=18
return c;
c=16
return c;
c=14
return c;
c=12
main() {
int x;
x=age(3);
printf("%d",x); }
main() { int a,b,c;
scanf(“%d,%d”,&a,&b);
c= jc(a,b);
printf(“sum is %d",c); }
int jc(int k, int j) { int z,m,i,s=1;
z=sum(k, j); m= pf(z); for(i=1;i<=m;i++) s=s*i; return s; }
scanf("%d%d%d",&a,&b,&c); d=dif(a,b,c); printf("Max-Min=%d\n",d);
}
int dif(int x,int y,int z) { return max(x,y,z)-min(x,y,z); }
int max(int x,int y,int z) { int r;
int sum(int x, int y) { return (x+y); }
int pf ( int h) { return (h*h); }
6.9.1 函数的嵌套调用
§C语言中不允许嵌套的函数定义,各函数之 间是平行的,不存在上一级函数和下一级函数 的问题。 void print( )
{ putchar('*'); void prnline( int n) { int i; for(i=0;i<=n;i++) putchar('\n'); }
总结:递归算法
递归函数名f(参数x) { if (x==初值) //递归结束的条件
结果=…; else
结果=含f(x-1)的表达式;
main() { f(n) …
}
返回结果(return); }
f(1或者0) { f(0)== …)
}
f(n) { f(n-1) }
f(n-1) { f(n-2) }
文件包含编译预处理命令
long factorial(int n);
函数声明
main()
{ int n1,n2;
long a;
long sum(int a, int b);
scanf("%d,%d",&n1,&n2);
实参 a=sum(n1,n2); 函数调用 printf("a=%1d",a);
} long sum(int a,int b)
f(n-2) { f(n-3) }
例2:用递归算法计算n! n!=n*(n-1)! (n-1)!=(n-1) *(n-2)! ………………….. 5!=5*4! 4!=4*3! 3!=3*2! 2!=2*1! 1!=1
long jc(int n) { long k;
if(n==1) k=1; else k=n*jc(n-1); return k; }
A
B
C
A >C A >B C >B A >C B >A B >C A >C
练习
1、用递归方法求和:
1!+2!+3!+4!+5!…+n!
其中n的值由键盘输入。 2、有5个人,第5个人说他的钱是第4个人的2 倍还多100元,第4个人说他是第3个人的2倍还 多100,第3个人说他是第2个人的2倍还多100, 第2个人说他是第1个人的2倍还多100,第1个 人说他1000元。求第5个人有多少钱。
间接调用
int f1(int x) int f2(int t)
{ int y,z; { int a,c;
……
来自百度文库
……
z=f2(y);
c=f1(a);
…….
…….
return(2*z); return(3+c);
}
}
【例1】有5个人,第5个人说他比第4个人大2 岁,第4个人说他对第3个人大2岁,第3个人说 他对第2个人大2岁,第2个人说他比第1个人大 2岁,第1个人说他10岁。求第5个人多少岁。
main() {
int n; printf (" input the number of diskes " :); scanf("%d",&n); move(n,'a','b','c'); }
运行情况如下: input the number of diskes:3 A >C A >B C >B A >C B >A B >C A >C
r=x>y?x:y; return(r>z?r:z); }
int min(int x,int y,int z) { int r;
r=x<y?x:y; return(r<z?r:z); }
练习
g(x,y)=
f( x+y) 2
x+y
(x<=y)
f(x-y) 2
x+y
( x>y)
其中:f(t)=(1+e-t)/(1+et) 求result=g(2.5,3.4)。
}
§C语言允许在一个函数的定义中出现对另一个函数 的调用(使用)。这样就出现了函数的嵌套调用,即在 被使用函数中又调用其他函数。
main( )函 数
①
②
f1( )函 数
③
④
f2( )函 数
调 用 f1( )函 数 调 用 f2( )函 数
⑤
后续语句
后续语句
⑨
⑧
结束
⑦
⑥
返回
返回
#include <stdio.h> long sum(int a, int b);
练习
• 例:编写求组合数的函数。
Cmn
m! n!(m n)!
6.9.2 函数的递归调用
递归: 一个函数直接或间接地使用自身。 1. 直接递归调用:函数直接调用本身 2. 间接递归调用:函数间接调用本身
直接调用
int f(int x) { int y,z;
…… z=f(y); ……. return(2*z); }
age( int 1n ) {
int c; if (n==1) c=10;
return c; }
age( int n3 ) {
int c;
else c= age( n2 -1 ) +2
return c; }
age( int 2n ) {
int c;
else c=age( n1 -1 ) +2
return c; }
例3、用递归法计算Fibonacci序列的第20项。
f= 1
n=1或者n=2
f(n-1)+f(n-2) n>2
根据数学公式,很容易将n阶的问题转化成 n-1阶和n-2阶的问题,即:f(n)=f(n-1)+f(n-2), 递归出口:n=1或者n=2。
程序如下: #include "stdio.h" int fib(int n) {
通过分析,设计递归函数如下: 10 (n=1)
age(n)= age(n-1)+2 (n>1)
程序如下:
age( int n ) {
int c; if (n==1) c=10; else c=age(n-1)+2;
return c; } main() {
int x; x=age(5); printf("%d",x); }
《C语言程序设计》
学习内容: 函数的嵌套调用和递归调用
6.9 函数的嵌套调用和递归调用
引例
编程函数求解:
y=(x+y)2 ! 然后调用函数求解(2+3)2!以及(3+4)2! 要求:
1、首先编写求和函数,求解x+y的和。 2、编写函数求解(x+y) 的平方(x+y)2 3、编写函数求解(x+y)2!
main() {
long x; x=jc(6); printf("%ld",x); }
long jc(int n) { long k;
int i; for(i=1;i<=n;i++) k=k*i; return k; } main() { long x; x=jc(6); printf("%ld",x); }