1、函数的嵌套定义
C语言中,所有函数都是平行独立的,无主次、相互包含之分。
函数可以嵌套调用,不可嵌套定义。
int max ( int a, int b)
{
int c;
int min ( int a, int b)
{ return ( a<b? a: b);
}
c=min(a,b);
return ( a>b? a : b);
}
int max ( int a, int b)
{ int c;
c=min(a,b);
return ( a>b? a : b);
}
int min ( int a, int b)
{ return ( a<b? a: b);
}
以上两个函数都错了,都是因为嵌套定义。
2、 为什么要编写递归函数
递归方法-分治法
分治法的基本思想是将一个规模较大的问题分解为若干个规模较小的子问题,且这些子问题相互独立并与原问题相同。
分治是算法设计中的一个重要思想。
递归的基本思想
问题分解:
把一个不能或不好解决的大问题转化为一个或几个小问题,再把这些小问题进一步分解成更小的小问题,最小问题可以直接解决。
递归的程序设计中的两个问题
⑴ 递归边界条件:
确定递归到何时终止,也称为递归出口;或者说,直接有解的情况
⑵ 递归模式:
大问题是如何分解为小问题的,也称为递归体。
例
猴子吃桃问题。猴子第1天摘下N个桃子,当时就吃了一半,还 不过瘾,就又吃了一个。第2天又将剩下的桃子吃掉一半,又多 吃了一个。以后每天都吃前一天剩下的一半零一个。到第10天再想吃的时候就剩一个桃子了,求第一天共摘下来多少个桃子?
分析:
设f(m)第m天吃桃前桃子数
f(10)=1;
f(9)=(f(10)+1)*2=4
f(8)=(f(9)+1)*2=10
f(7)=(f(8)+1)*2=22
……
f(1)=(f(2)+1)*2=?
用式子表述:
f(n)=1 (n=10)
f(n)=(f(n+1)+1)*2 (n>=1)
写出来就是这样:
#include <iostream>
using namespace std;
int f(int n)
{
int c;
if (n==10) c=1;
else
c=(f(n+1)+1)*2;
return c;
}
void main(void)
{ int f(int);
cout<<f(1)<<endl;
}
3、、局部变量和全局变量
在一个函数内部定义的变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外是不能使用这些变量的。
说明:
(1)在复合语句中定义的变量只在本复合语句范围内有效。
(2)形参属于局部变量
(3)不同函数中同名变量,占不同内存单元
(4) 在函数声明中出现的参数名,其作用范围只在本行的括号内。
1、全局变量
程序的编译单位是源程序文件,一个源文件可以包含一个或若干个函数。
在函数内定义的变量是局部变量
在函数之外定义的变量是外部变量,称为全局变量。
全局变量的有效范围为从定义变量的位置开始到本源文件结束。
说明:
(1) 设全局变量的作用是增加函数间数据联系的渠道。
(2) 建议不在必要时不要使用全局变量,因为:
① 全局变量在程序的全部执行过程中都占用存储单元,而
不是仅在需要时才开辟单元。
② 它使函数的通用性降低了
③ 使用全局变量过多,会降低程序的清晰性。
(3) 如果在同一个源文件中,全局变量与局部变量同名,则在局部变量的作用范围内,全局变量被屏蔽,即它不起作用。
4、变量的有效范围称为变量的作用域
变量作用域分为5类
文件作用域
全局变量
函数作用域
局部变量
块作用域
局部变量
函数原型作用域
作用域从变量起作用的范围对变量进行了讨论
即变量生存的空间
5、变量的存储类别
动态存储方式与静态存储方式
作用域是从空间的角度来分析的,分为全局变量和局部变量。
存储类别是从生存时间的角度来分析的,指的是数据在内存中存储的方法,分为动态存储变量和静态存储变量。具体包含4种:
自动的
静态的
寄存器的
外部的
6、不同类型的局部变量的特点
(1)动态局部变量(自动变量):默认,存储在动态区
(2)寄存器变量:在CPU内部存储
(3)静态局部变量(:存储在静态区
动态局部变量未被赋值时,其值为随机值。其作用域的函数或复合语句结束时,空间被程序收回。
程序执行到静态局部变量时,为其在静态区开辟存储空间,该空间一直被保留,直到程序运行结束。
由于存储在静态区,静态局部变量或全局变量未赋值时,系统自动使之为0。
静态局部变量只被初始化一次。