理解递归

递归与循环

如果我们需要重复的多次计算相同的问题,通常可以选择递归或循环两种不同的方法,递归是在一个函数内部调用这个函数自身,而循环则是通过设置计算的初始值及终止条件,在一个范围内重复运算。递归特点是简洁,但效率不如循环(反复的进栈,出栈),而且有可能引起调用栈溢出。


递归本质:

例如:给出一个值4267, 我们需要依次产生字符‘4’, ‘2’, ‘6’, ‘7’.


分析递归的工作原理:

第一步:当函数刚开始执行时,堆栈的内容如下:


第二步:执行除法运算之后,堆栈的内容如下:


第三步:接着,if语句判断出p的值非零,所以对该函数执行递归调用。当这个函数第二次被调用之初,堆栈内容如下:


第四步:堆栈上创建了新的变量,隐藏了前面的那批变量,除非当前这次递归调用返回,否则它们是不能被访问的,再次执行除法运算之后,堆栈的内容如下:


第五步:m的值现在为42,仍然非零,所以继续执行递归调用,并再创建一批变量。在执行完这次调用的除法运算之后,堆栈的内容如下:


第六步:此时,m的值还是非零,继续执行递归调用。在执行除法运算之后,堆栈内容如下:


第七步:现在m的值为零,递归函数不再调用自身,而开始打印输出。然后函数返回,并开始销毁堆栈上的变量值。每次调用putchar得到的变量m的最后一个数字,并对m进行模10取余运算,将它与字符常量’0’相加,并输出结果。

输出结果:4

第八步:接着函数返回,它的变量从堆栈中销毁。接着,递归函数的前一次调用重新继续执行,它使用的是自己变量,它们位于堆栈的顶部。因为它的m值是42,所以调用putchar后打印出来的数字是2.

输出结果:42

输出结果:426

输出结果:4267


原文地址:原文地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值