函数的嵌套与递归

函数的嵌套

定义函数时不能定义另外一个函数,但是可以嵌套调用函数例如,多数寻找最大值的程序就是应用了函数的嵌套。

函数的递归(函数的递归是特殊的嵌套)

递归函数一般形式:

反值类型  递归函数名(参数说明表)

{

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;

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
函数嵌套指在一个函数中调用另一个函数,而递归则是指函数调用自身的过程。 在C语言中,函数嵌套可以让程序更加模块化,便于维护和阅读,也可以提高程序的可重用性。例如,一个函数中需要调用另一个函数来完成某个功能,可以将这个函数嵌套在主函数中。 函数嵌套的语法很简单,例如: ```c void func1() { printf("This is function 1\n"); } void func2() { printf("This is function 2\n"); func1(); } int main() { func2(); return 0; } ``` 在上面的例子中,func2()函数中调用了func1()函数递归则是指一个函数调用自身的过程。递归函数必须包含一个停止条件,否则将会出现无限递归导致程序崩溃。递归函数可以用于解决一些问题,例如计算阶乘、斐波那契数列等。 下面是一个计算阶乘的递归函数的示例: ```c int factorial(int n) { if (n == 0) { return 1; } else { return n * factorial(n - 1); } } int main() { int result = factorial(5); printf("%d", result); return 0; } ``` 在上面的例子中,factorial()函数调用自身来计算阶乘。当n等于0时,递归停止,函数返回1。否则,函数计算n的阶乘并返回结果。 需要注意的是,递归函数的效率有时候并不高,因为每次调用函数都需要将函数的参数和返回地址等信息压入栈中,消耗了一定的时间和内存。因此,在使用递归函数时,应该尽量避免出现无限递归的情况,以及递归次数过多导致栈溢出等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值