递归的思考方式

当学习递归的时候大家都不经意间试图将递归展开,研究它什么时候返回,什么时候继续前进,返回带回来什么信息等。但是那些都是为了便于你了解递归的底层实现原理,真正使用递归思想的时候如果还用这一套分析方法就显得有些呆板了,把递归分成递推和回归的做法除非是为了分析递归本身,否则是不明智的。

真正的递归思想就是假设我们已经得到了结果然后我们应该怎么办。例如下面这两个链表正序和逆序输出的例子:

void BackShow(Node *n)
{
    if (n == NULL) return;
    BackShow(n->next);
    cout << n->data;
}//逆序输出
void Show(Node *n)
{
    if(n==NULL) return;
    cout<< n->data;
    Show(n->next)
}

以上两个简单的递归算法如果用展开的方法分析的话会有很长的逻辑链,说白了就是想起来不是特别的连贯,容易出现逻辑漏洞。这只是一个小程序,如果算法大了势必会导致大量的逻辑漏洞。因此我们要使用正统的递归思维。

对于第一个逆序输出,我们的思考逻辑是这样的“如果n为空那么就不用输出了直接返回,然后先输出后面的,再输出自己”,这样我们只思考了两个点的关系就描述完成了n个点要做的事。就在于这个“先输出后面的”中假设后面的已经被输出了。

第二个正序输出,我们的思考逻辑是这样的“如果n为空那么就不用输出了直接返回,然后先输出自己,再输出后面的”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值