谁能帮我分别举一个例子,是关于函数的嵌套调用和递归调用的(要每一步都详细解说一下,非常感谢!}
4个回答
展开全部
7.5.1 函数嵌套调用
函数嵌套调用:在被调函数中再调用其它函数称函数嵌套调用。
◆ C语言不能嵌套定义函数。
例如:在下列调用f1函数中调用f2函数。
float f1(int a, int b)
{
…
f2(a+b,a-b);
…
}
int f2(int x, int y)
{
…
}
调用过程如图7.2所示。
【例7.10】求1k+2k+3k+…+nk的值,假设k为4,n为6。
#include "stdio.h"
void main( )
{
int sum, n=6, k=4;
sum=add(k, n);
printf("输出结果为:%d",sum );
}
add(int a,int b) /*该函数功能:进行累加*/
{
int i, s=0;
for(i=1; i<=b; i++)
s=s+powers(i,a);
return(s);
}
powers(int m, int n) /*该函数功能:进行累乘*/
{
int j, p=1;
for (j=1; j<=n; j++)
p=p*m;
return(p);
}
运行结果为:
2275
7.5.2 函数递归调用
递归调用:在调用一个函数的过程中直接或间接地调用该函数本身,称为函数的递归调用。
在编写递归调用程序时注意:
(1)递归程序算法:即如何实现其递归;
(2)递归调用的结束条件:避免无止境递归调用造成死循环。所以递归调用应为条件递归调用:
if (条件) 递归调用
else ……
【例7.11】用递归算法编程求n!阶乘的程序。
从数学可知:n!=1*2*3* … *n,可得:
递归调用的结束条件:
if( (n==0)|| (n==1)) return(1);
else return(n*fac(n-1)); /* fac(n-1)求(n-1)!函数*/
程序如下:
int fac(int n)
{
if (n<0) printf("n<0,输入数据错误!");
else if( (n==0)|| (n==1)) return(1);
else return(n*fac(n-1));
}
void main( )
{
int n, y;
printf("请输入一个整数:");
scanf("%d",&n);
y=fac(n);
printf("%d!=%d",n, y);
}
运行结果为:
请输入一个整数:5↙
5!=120
【例7.12】调用一个递归函数,将一个整数的低位变成高位,高位变成低位组成另一个整数,例如输入1234得到另一个整数4321。
#include "stdio.h"
int fun(int n, int m)
{
if (n==0) return m;
else return fun(n/10, m*10+n%10);
}
void main( )
{
printf("%d\n",fun(1234, 0));
}
函数嵌套调用:在被调函数中再调用其它函数称函数嵌套调用。
◆ C语言不能嵌套定义函数。
例如:在下列调用f1函数中调用f2函数。
float f1(int a, int b)
{
…
f2(a+b,a-b);
…
}
int f2(int x, int y)
{
…
}
调用过程如图7.2所示。
【例7.10】求1k+2k+3k+…+nk的值,假设k为4,n为6。
#include "stdio.h"
void main( )
{
int sum, n=6, k=4;
sum=add(k, n);
printf("输出结果为:%d",sum );
}
add(int a,int b) /*该函数功能:进行累加*/
{
int i, s=0;
for(i=1; i<=b; i++)
s=s+powers(i,a);
return(s);
}
powers(int m, int n) /*该函数功能:进行累乘*/
{
int j, p=1;
for (j=1; j<=n; j++)
p=p*m;
return(p);
}
运行结果为:
2275
7.5.2 函数递归调用
递归调用:在调用一个函数的过程中直接或间接地调用该函数本身,称为函数的递归调用。
在编写递归调用程序时注意:
(1)递归程序算法:即如何实现其递归;
(2)递归调用的结束条件:避免无止境递归调用造成死循环。所以递归调用应为条件递归调用:
if (条件) 递归调用
else ……
【例7.11】用递归算法编程求n!阶乘的程序。
从数学可知:n!=1*2*3* … *n,可得:
递归调用的结束条件:
if( (n==0)|| (n==1)) return(1);
else return(n*fac(n-1)); /* fac(n-1)求(n-1)!函数*/
程序如下:
int fac(int n)
{
if (n<0) printf("n<0,输入数据错误!");
else if( (n==0)|| (n==1)) return(1);
else return(n*fac(n-1));
}
void main( )
{
int n, y;
printf("请输入一个整数:");
scanf("%d",&n);
y=fac(n);
printf("%d!=%d",n, y);
}
运行结果为:
请输入一个整数:5↙
5!=120
【例7.12】调用一个递归函数,将一个整数的低位变成高位,高位变成低位组成另一个整数,例如输入1234得到另一个整数4321。
#include "stdio.h"
int fun(int n, int m)
{
if (n==0) return m;
else return fun(n/10, m*10+n%10);
}
void main( )
{
printf("%d\n",fun(1234, 0));
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
利用递归将字符串倒置
void recur(char *c,int k){ //k为字符串长度
char tmp;
if(k>1){ //递归退出条件
recur(c+1,k-2);// 递归到字符串中间位置 然后再向外展开进行交换
tmp=c[0];
c[0]=c[k-1];
c[k-1]=tmp;
}
}
void recur(char *c,int k){ //k为字符串长度
char tmp;
if(k>1){ //递归退出条件
recur(c+1,k-2);// 递归到字符串中间位置 然后再向外展开进行交换
tmp=c[0];
c[0]=c[k-1];
c[k-1]=tmp;
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
谭浩强的书上写的很详细,沉下心去读3遍。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
可以这样来理解,嵌套调用是a调用b,而递归是a调用a,即本身。
既然对c函数搞不懂,就先把c学好。
既然对c函数搞不懂,就先把c学好。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询