C Primer Plus(6) 中文版 第9章 函数 9.3 递归

本文介绍了C语言中的递归概念,包括递归的基本原理和递归函数的编写。通过示例代码展示了递归函数`up_and_down()`的使用,解释了递归调用的层次和变量的独立性。同时,文章讨论了递归的优缺点,如简洁性与效率问题,并给出了斐波那契数列的递归实现,强调了指数增长的变量可能导致的效率问题。最后指出,虽然main()函数特殊,但也可以进行递归调用。
摘要由CSDN通过智能技术生成

9.3 递归
C允许函数调用它自己,这种调用过程称为递归(recursion)。递归有时难以捉摸,有时却很方便实用。结束递归是使用递归的难点,
因为如果递归代码中没有终止递归的条件测试部分,一个调用自己的函数会无限递归。
可以使用循环的地方都可以使用递归。有时用循环解决问题比较好,但有时用递归更好。递归方法更简洁,但效率却没有循环高。
9.3.1 演示递归
main()函数调用up_and_down()函数,这次调用称为“第1级递归”。然后up_and_down()调用自己,这次调用称为“第2级递归”。接着
第2级递归调用第3级递归,一次类推。
%p转换说明打印地址,如果你的系统不支持这种该是,请使用%u或%lu代替%p)。
/* recur.c -- recursion illustration */
#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
    

/* 输出:

*/ 

注意,每级递归的变量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()都是相同的函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_40186813

你的能量无可限量。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值