递归就是在函数内部代码中调用这个函数本身
递归的三大要素:
第一要素:明确这个函数要做什么
建议写注释注明函数的作用
第二要素:寻找递归结束条件
递归不断调用自身,所以递归函数必须要有递归的结束条件,否则递归函数就会一直调用自己,进入死循环。
找出递归函数参数为什么时,递归才会结束,这时候直接把结果返回
第三要素:找出函数的等价关系式
第三要素就是,我们要不断缩小参数的范围,缩小之后,我们可以通过一些辅助的变量或者操作,使原函数的结果不变。
例如,f(n) 这个范围比较大,我们可以让 f(n) = n * f(n-1)。这样,范围就由 n 变成了 n-1 了,范围变小了,并且为了原函数f(n) 不变,我们需要让 f(n-1) 乘以 n。
说白了,就是要找到原函数的一个等价关系式,f(n) 的等价关系式为 n * f(n-1),即f(n) = n * f(n-1)。
例1:反转链表
1.定义递归函数功能
Node *reverseList(Node *head){
}
2.寻找递归结束条件
当列表只有一个节点或者是空表时,啥也不用干
Node *reverseList(Node *head){
if(head==NULL||head->next==NULL){
return head;
}
}
3.寻找等价条件
等价条件一定是范围不断的缩小,
1->2->3->4
先反转2->3->4,reverseList(head->next)
Node *reverseList(Node *head) {
if (head == NULL || head->next == NULL) {
return head;
}
else {
Node* newhead = reverseList(head->next);
head->next->next = head;
head->next = NULL;
return newhead;
}
}