数据结构复习————递归与栈

本文探讨了递归的定义,指出一个适合使用递归算法的问题特征,并通过汉诺塔问题举例说明。递归与栈的概念紧密相连,阐述了函数调用时栈的管理和返回过程。最后,给出了汉诺塔问题的递归解决方案及其C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

递归的定义:

若一个对象部分的包括它自己,或用它自己给自己定义,则称这个对象是递归的,递归也可定义为,在一个过程中直接或间接的调用自己,则这个过程也是递归的。

能采用递归算法的问题的特征:

当一个问题具有以下三个特征时,就可以用递归算法。
1)大问题能分解成若干个子问;

2)子问题或是一个定值(直接解),或是与大问题具有相同性质的问题仅仅是规模比大问题小,即被定义项在定义中应具有更小的尺度;

3)子问题在最小尺度上有直接解,即分解过程能最终能结束(递归有结束条件)。

举个列子,比方说求n!(n为自然数)。正常人为的求解可能是1x2x3x—(n-1)xn。但这个问题可以分为两种情况考虑:
(1)当n=0时,n!=1
(2)当n>0时,n!=nx(n-1)!
再对照上述的三个条件,n!分为一个子问题n(为一个定值),和另一个规模比n!小的问题(n-1)!满足1),2)两个条件。再者(n-1)!可以继续分:(n-1)!=(n-1)x(n-2)!=(n-1)x(n-2)x(n-3)!=—,—x2x1!。而1!就等于1,所以子问题在最小尺度上有直接解,满足条件3)。其递归函数如下所示:

int fact(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值