函数的嵌套
定义函数时不能定义另外一个函数,但是可以嵌套调用函数例如,多数寻找最大值的程序就是应用了函数的嵌套。
函数的递归(函数的递归是特殊的嵌套)
递归函数一般形式:
反值类型 递归函数名(参数说明表)
{
if(递归终止条件)
返回值=递归终止值;
else
返回值=递归调用(……)的表达式;
return 返回值;
}
汉诺塔问题:(经典递归调用问题)
#include<stdio.h>
#include<stdlib.h>
void move(char x, char y)//输出移盘方案
{
printf("%c->%c\n", x, y);
}
void hanoi(int n, char one, char two, char three);
{
if (n == 1) move(one, three); //如果是1个盘,直接从第一个座移到第3个座上
else
{
hanoi(n - 1, one, three, two);
move(one, three);
hanoi(n - 1, two, one, three);
}
}
int main()
{
int n;
printf("输入盘的个数\n");
scanf("%d", &n);
printf("移盘的步骤:\n");
hanoi(n, 'A', 'B', 'C'); system("pause");
return 0;
递归的细节补充:
1.每次递归都有自己的变量,可能名称相同,但每次递归结束的值都不同。//系统调用时,都会自动保存当前函数的参数变量,递归时再开辟一片新的对应空间
2.每次调用都要有返回值,递归结束后,控制权回到上一级函数。//递归结束后会释放开辟的这片空间,同时记录递归得到的值。
3.每次递归必须逐级返回,不能跳跃或者间断。
4.函数中递归语句之前的代码,按照被调函数的顺序执行,递归之后的代码按照被调函数相反的顺序执行。
递归思想解决斐波拉及数列:
int Fib(int n)
{
if(n<=2)
return 1;
int a=1;
int b=1;
int c=1;
while(n>=3)
{
c = a + b;
b = a;
c = b;
n--;
}
return c;
}
int main()
{
int n=0;
scanf("%d\n",&n);
printf("%d\n,",Fib(n));
return 0;
}