0.简单理解
0.1.生成一个函数的执行栈,将本次参数和未执行的函数(一般是归来过程)压入栈中,后调用的函数先返回值(有时候也会没有返回值,没有返回值时,用该层的参数执行未完成的函数,然后返回下一层)。
0.2.一般情况下if后写终止条件。
1.应用
- 递归定义的数学函数:(1)阶乘函数。(2)2阶Fibonacci数列。
- 具有递归特性的数据结构:(1)二叉树。(2)广义表。
- 可递归求解的问题:(1)迷宫问题。(2)Hanoi塔问题。
2.解决问题方式
- 在递去过程中解决。(把递归函数前所有函数执行完,进入递归,没有未执行函数被push到递归函数栈)
function recursion(大规模){
if (end_condition){ // 明确的递归终止条件
end; // 简单情景
}else{ // 在将问题转换为子问题的每一步,解决该步中剩余部分的问题
solve; // 递去
recursion(小规模); // 递到最深处后,不断地归来
}
}
- 在归来过程中解决。(当函数执行到递归位置时,将后未执行的solve等函数push到递归函数栈中)
function recursion(大规模){
if (end_condition){ // 明确的递归终止条件
end; // 简单情景
}else{ // 先将问题全部描述展开,再由尽头“返回”依次解决每步中剩余部分的问题
recursion(小规模); // 递去
solve; // 归来
}
}
3.例
3.1
本例在递去过程执行上侧print() 函数,并把n值和下侧的print() 函数push进函数栈。在归来时执行print(n)。
//方法
void function(int n){
//打印递增的数
printf(n);
//递归调用
if(n<=10){
function(3*n);
}
//打印递减的数
printf(n);
}
//测试代码
int main() {
function(1);
}
//output:
//1
//3
//9
//27
//27
//9
//3
//1
3.2
本例原题为leetcode——剑指offer 06——从尾到头打印链表。
当head为空时此时意味着已经在链表尾部的结构体中,此时递归函数栈最顶部成员返回一个空集给下一个成员,在下一个成员中a接收到递归函数返回的空集,此时的head为链表中最后一个结构的地址,提取值并将其push到a,将a返回函数栈下一个成员中,依次递推。。。。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
vector<int> reversePrint(ListNode* head) {
if (NULL == head) return {};
vector<int> a = reversePrint(head->next);
a.push_back(head->val);
return a;
}
};