内容正文:
第六章 程序的模块化--函数
1
CONTENTS
目录
01
02
函数的分类
函数的认知
03
自定义函数及其应用
04
函数的调用
CONTENTS
目录
05
06
函数的递归调用
函数的嵌套调用
07
数组作为函数的参数
08
变量的作用域
C语言
知识树
My First Template
函数的递归调用
C语言程序设计
5
C语言
C语言程序设计 函数的递归调用
本次任务
利用递归调用
计算n!
My First Template
C语言程序设计 函数的递归调用
C语言
包含命令 #include <stdio.h>
宏定义命令 #define PI 3.1415926
为了与一般C语句相区别,这些命令以符号“#”开头。
有这么一个古老的故事,从前有座山,山上有座庙,庙里有个老和尚和小和尚, 老和尚给小和尚讲故事,讲的是:从前有座山,山上有个庙,庙里有个老和尚和小和尚,老和尚给小和尚讲故事,讲的是。。。
My First Template
C语言程序设计 函数的递归调用
C语言
包含命令 #include <stdio.h>
宏定义命令 #define PI 3.1415926
为了与一般C语句相区别,这些命令以符号“#”开头。
从前有座山,山上有座庙,庙里有个老和尚和3岁的小和尚, 老和尚给小和尚讲故事,讲的是:从前有座山,山上有个庙,庙里有个老和尚和2岁的小和尚,老和尚给小和尚讲故事,讲的是从前有座山,山上有个庙,庙里有个老和尚和1岁的小和尚。。。
My First Template
C语言程序设计 函数的递归调用
C语言
函数递归调用的特点
在源程序中这些命令都放在函数之外,一般都放在源程序的前
面,我们称为预处理部分
C语言与其他语言的重要区别:就是C语言中可使用预处理命令
定义:在调用一个函数的过程中又直接或间接地调用该函数本身
注意:递归调用必须在满足一定条件时结束递归调用,否则无限地
递归调用将导致程序无法结束。
My First Template
C语言程序设计 函数的递归调用
C语言
函数递归调用的特点
在源程序中这些命令都放在函数之外,一般都放在源程序的前
面,我们称为预处理部分
C语言与其他语言的重要区别:就是C语言中可使用预处理命令
一个问题成为递归必须具备的条件是:
1、后一部分与原始问题相似
2、后一部分是原始问题的简化
My First Template
C语言程序设计 函数的递归调用
C语言
程序中的递归方式
直接递归调用
间接递归调用
My First Template
C语言程序设计 函数的递归调用
C语言
直接递归调用
int f(int x)
{
int y,z;
……
z=f(y);
…….
return(2*z);
}
:函数直接调用本身
My First Template
C语言程序设计 函数的递归调用
C语言
间接递归调用
int f1(int x)
{ int y,z;
……
z=f2(y);
…….
return(2*z);
}
int f2(int t)
{ int a,c;
……
c=f1(a);
…….
return(3+c);
}
说明
在递归调用中,主调函数又是被调函数。执行递归函数将反复调用其自身,每调用一次就进入新的一层。
C语言对递归函数的自调用次数没有限制
必须有递归结束条件
:函数间接调用本身
My First Template
C语言程序设计 函数的递归调用
C语言
任务:利用递归调用计算n!
#include "stdio.h"//预处理
int fac(int n)//每次调用使用不同的参数
{
int t;
if((n==1)||(n==0))//当满足这个条件,返回1
t=1;
else
t=n*fac(n-1);//递归调用函数自身,求(n-1)!
return t;
}
void main(){
int m,n;
printf("Input a integer number:");
scanf(“%d”,&m);
n=fac(m);
printf(“%d!=%d
”,m,n);}
1
1
C语言程序设计 函数的递归调用
C语言
调用和返回的递归示意图(n=3)
fac(1)
= 1
调用
调用
返回
返回
fac(3)
=3*fac(2)
=3*2
=6
fac(2)
=2*fac(1)
=2*1
= 2
$$