C语言学习笔记day18--递归函数示例与分析

C允许函数调用自己,这种调用过程称为递归       

可以使用循环的地方通常都可以使用递归。有时候循环解决问题比较好,但有时用递归更好,递归方案更简洁,但效率没有循环高。

我们通过一个程序示例来学习什么是递归

该程序中,main()函数调用up_and_down()函数,这次调用成为“第1级递归”。然后up_and_down()函数调用自己,这次调用称为“第2级递归”。接着第2级递归调用第3级递归以此类推。示例程序中共有4级递归。(为了进一步深入研究递归时发生了什么,程序不仅显示了变量n的值,还显示了储存n的内存地址&n,下篇文章会详细讨论&运算符。)

/*recur.c——递归演示*/
#include <stdio.h>
void up_and_down(int);

int main(void)
{
    up_and_down(1);
    return 0;
}
void up_and_down(int n)
{
    printf("Level %d:n location %p\n",n,&n);//#1
    if(n<4)
        up_and_down(n+1);
    printf("LEVEL %d:n location %p\n",n,&n);//#2
}

输出结果如下:

Level 1 :n location 0x0012ff48

Level 2 :n location 0x0012ff3c

Level 3 :n location 0x0012ff30

Level 4 :n location 0x0012ff24

LEVEL 4 :n location 0x0012ff24

LEVEL 3 :n location 0x0012ff30

LEVEL 2 :n location 0x0012ff3c

LEVEL 1 :n location 0x0012ff48

分析程序:

       首先,main()调用了带参数1的up_and_down(),执行结果是up_and_down()中的形式参数n的值是1,所以打印语句#1打印Level 1。然后,因为n<4,up_and_down()(第一级)调用实际参数为n+1(或2)的up_and_down()(第2级)。所以第2级调用中的n的值是2,打印语句#1打印Level 2.以此类推,下面两次调用打印的分别是Level 3和Level 4.

      当执行到第4级时,n的值是4,所以if测试条件为假。up_and_down()函数不再调用自己第4级调用接着执行打印语句#2,也就是打印LEVEL 4,因为n的值为4。此时,第4级调用结束,控制被传回它的主调函数(即第3级调用)。在第3级调用中,执行的最后一条语句是调用if语句中的第4级调用。被调函数(第4级调用)把控制返回在这个位置,因此,第3级调用继续执行后面的代码,打印语句#2打印LEVEl 3。然后第3级调用结束,控制被传回第2级调用,接着打印LEVEl 2,以此类推。

注意:每级递归的变量n都属于本级递归私有。这从程序输出的地址值可以看出(Level 1和LEVEL 1的地址相同,Level 2和LEVEL 2地址相同...)

还可以这样理解,假设有一条函数调用链——fun1()调用fun2()、fun2()调用fun3()、fun3()调用fun4()。当fun4()结束时,控制传回fun3();当fun3()结束时,控制传回fun2(),当fun2()结束时,控制传回fun1()。递归的情况与此类似,只不过fun1()、fun2()、fun3()、fun4()都是相同的函数。

 

欧克,这就是递归函数的初步认识了,下一篇写原理解析,bye

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 可以使用函数来计算1到n之和。函数是指在函数内部调用自身的函数。具体实现方法如下: 1. 定义一个函数sum,输入参数为n,输出参数为1到n之和。 2. 在函数内部,判断n是否等于1,如果是,则返回1;否则,返回n加上sum(n-1)的结果。 3. 在主函数中,输入n,调用sum函数,输出结果。 代码如下: ``` def sum(n): if n == 1: return 1 else: return n + sum(n-1) n = int(input("请输入一个正整数:")) print("1到", n, "之和为:", sum(n)) ``` 例如,输入n为5,则输出结果为:1到5之和为:15。 ### 回答2: 练习10-1 要求使用函数计算从1到n的和。函数是一种函数调用自身的技术,可以用于求解某些问题,比如计算数列的值、搜索树的结点个数等。函数需要定义结束条件,避免无限归导致程序崩溃。 对于本题,可以定义函数sum(n)表示计算从1到n的和。当n=1时,sum(n)返回1;否则,sum(n)返回sum(n-1) + n。因此,函数sum(n)的计算过程如下: 1. 当n=1时,sum(1) = 1; 2. 当n>1时,sum(n) = sum(n-1) + n。 需要注意的是,函数的时间复杂度可能会很高,因为每次调用都会产生一些开销。如果数据规模比较大,可能会导致函数耗费大量时间和内存。因此,在实际应用中需要控制归深度和优化算法。 Python代码实现如下: def sum(n): if n == 1: return 1 else: return sum(n-1) + n n = int(input("请输入一个整数n,计算1到n的和:")) print("1到%d的和为%d" % (n, sum(n))) ### 回答3: 归是一种常用的算法,它可以解决很多问题,包括计算1到n之和。在计算1到n之和的问题中,我们可以使用函数来解决。 函数的基本思想是将一个大问题分解成多个小问题,然后这些小问题又可以继续分解成更小的问题,直到问题足够小可以直接计算。在计算1到n之和的问题中,我们可以使用函数来实现,具体步骤如下: Step1:定义函数函数名为sum,传入一个参数n表示计算1到n之和。 Step2:判断n是否为1,如果是,则直接返回1,表示1到1之和为1。 Step3:如果n不为1,则调用函数sum(n-1)计算1到n-1之和,然后再加上n,即可得到1到n之和。 Step4:最后,返回求和结果即可。 以下是代码实现: ```python def sum(n): if n == 1: return 1 else: return sum(n-1) + n ``` 上述代码中,当n为1时,返回1;否则,调用sum(n-1)归计算1到n-1之和,然后加上n返回结果。这样,通过不断归调用,可以计算得到1到n之和。 需要注意的是,在使用函数时,需要注意归深度的问题。如果归深度太大,或者函数的实现不恰当,可能会导致栈溢出等问题。因此,在使用函数时,需要谨慎处理归调用,避免出现问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值