当学习递归的时候大家都不经意间试图将递归展开,研究它什么时候返回,什么时候继续前进,返回带回来什么信息等。但是那些都是为了便于你了解递归的底层实现原理,真正使用递归思想的时候如果还用这一套分析方法就显得有些呆板了,把递归分成递推和回归的做法除非是为了分析递归本身,否则是不明智的。
真正的递归思想就是假设我们已经得到了结果然后我们应该怎么办。例如下面这两个链表正序和逆序输出的例子:
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为空那么就不用输出了直接返回,然后先输出自己,再输出后面的”