1递归:
本质:主问题被拆成相同的子问题
子问题又被拆成相同的子问题
2如何理解递归
把递归的函数当作一个黑盒,不需要关心递归展开的细节
3步骤
1先找到相同的子问题:---》设计函数头
2只关心某一个子问题是如何解决的——》设计函数体
3处理边界条件---》递归的出口条件
4例题
1.面试题 08.06. 汉诺塔问题
把主问题拆为:把某个位置例如A的n个柱子通过B传到C
2.21. 合并两个有序链表
相同子问题:把某以list1和list2为起点的两个链表合并
子问题解决:将两头节点内的值较小的作为要返回的头节点,剩下的 变成子问题:合并除要返回的头节点的两个链表的合并
3. 206. 反转链表
子问题:把以某个节点为起点的链表反转
链表的题一定要注意节点指针的指向
这题在将head->next反转后 head仍指向第二个节点
4. 24. 两两交换链表中的节点
5 . 50. Pow(x, n)
用暴力当n过大,会超时
快速幂
实现:1循环2递归
例如
求3^16->3^8->3^4->3^2->3
上面是刚好可以除尽的
如果除不尽
例如
3^21->3^10(3^10*3^10*3)->3^5->3^2(3^2*3^2*3)->3
时间复杂度为o(logn)
溢出问题
注意 :n有可能为负数,相当于(1/x)^n 每次取负数时都要防止溢出,因为int范围是
(-2^31,2^31-1),取负数时用long