函数的性质
一个C程序可由一个主函数和若干个其他函数构成,主函数可调用其他函数,其他函数也可以相互调用,同一个函数可以被一个函数或多个函数调用任意多次。
优点:
(1)提高代码的复用性;
(2)对功能和任务的拆解。(函数可以把代码拆解为多个模块,但模块越多效率相对越低。)
函数定义的形式
类型标识符 函数名(形参表列)
{
声明部分
语句部分
}
在定义函数时,函数名后面括号中的变量名称为“形式参数”,在主调函数调用函数时,函数名后面括号中的变量名称为“实际参数”。
函数名要符合标识符命名规则且不与系统库函数重名。
形参表列:需有每个形参的类型和名称,以 , 分隔。
(1)在定义函数中制定的形参,若未出现函数调用时,他们并不占内存中的存储单元,只有在函数调用时,系统才为其分配内存单元,调用结束后,形参中所占的内存单元被释放。
(2)实参可以是常量,变量,表达式。
函数调用
函数需先声明,后使用(或将被调函数写于主调函数之前),在主调函数前引入被调函数声明,声明时形参可省略。
被调函数必须是已存在函数,对于库函数,调用前需包含相应头文件。
在调用一个函数的过程中又出现直接或间接的调用该函数本身,称为函数的递归调用。
*用函数的递归调用求解汉诺塔问题*
void H(int m, char a, char b, char c)
{
if (m == 1)
{
printf("%c–>%c", a, c);
puts(" “);
}
else
{
H(m - 1, a, c, b);
printf(”%c–>%c", a, c);
puts(" “);
H(m - 1, b, a, c);
}
}
int main()
{
int m;
printf(“请输入所要移动的层数:\n”);
scanf(”%d", &m);
printf(“所要移动的步骤如下:\n”);
H(m, ‘A’, ‘B’, ‘C’);
return 0;
}
用函数的递归调用求一个数的阶乘
int f(int m)
{
int k;
if (m < 0)
{
printf("%d<0,输入有误!", m);
}
else if (m == 0 || m == 1)
{
k = 1;
}
else
{
k = f(m - 1)*m;
}
return k;
}
int main()
{
int m;
int y = 0;
printf(“请输入所求的数:\n”);
scanf("%d", &m);
y = f(m);
printf("%d!= %d\n", m, y);
}