企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[TOC] # 简介 本质上,将原来的问题,转化为更小的同一问题 举例 `Sum(arr[0...n-1]) = arr[0] + Sum(arr[1...n-1])`更小的同一问题 `Sum(arr[1...n-1]) = arr[1] + Sum(arr[2...n-1])`更小的问题 `Sum(arr[n-1...n-1]) = arr[n-1] + Sum([])` 最基本的问题 # 代码 ~~~ public class Sum { public static int sum(int[] arr) { return sum(arr, 0); } //计算arr[l...n)这个区间内所有数字的和 private static int sum(int[] arr, int l) { //当初始值和我们这个数组的长度相等的时候,表示已经到了边界了 if (l == arr.length) { return 0; } return arr[l] + sum(arr, l + 1); } //测试下 public static void main(String[] args) { int[] nums = {1, 2, 3, 4, 5, 6}; System.out.println(sum(nums)); } } ~~~ # 分析 1. 有求解的最基本问题,需要我们自己写 2. 把原问题转化为更小的问题(核心) ![](https://box.kancloud.cn/a2987bca9b77c35c319b618d4d6be852_1373x350.png) 注意递归函数的宏观语义 递归函数就是一个函数,完成一个功能 # 链表天然的递归性 ![](https://box.kancloud.cn/51373716f7be4e9f34dfb8f950cbadeb_1090x481.png) ## 问题 摘取leetcode https://leetcode-cn.com/problems/remove-linked-list-elements/description/ 删除链表中等于给定值 val 的所有元素。 示例 给定: 1 --> 2 --> 6 --> 3 --> 4 --> 5 --> 6, val = 6 返回: 1 --> 2 --> 3 --> 4 --> 5 我们再看下leetcode的这个问题 ![](https://box.kancloud.cn/0062f346f15c8628aff79e739e97fb47_1387x664.png) ## 代码 ~~~ public class Solution { public ListNode removeElements(ListNode head, int val) { //当递归到头节点为null,表示链表已经被查完了 if (head == null) { return null; } // ListNode res = removeElements(head.next, val); // //head也满足被删除的条件 // if (head.val == val) { // //表示head后面的元素满足条件 // return res; // } else { // //这边表示head不要删除 // head.next = res; // //就把head那边满足条件的返回 // return head; // } //简写 head.next = removeElements(head.next, val); return head.val == val ? head.next : head; } } ~~~ ## 分析 ![](https://box.kancloud.cn/724d7a8b479008fca9bf749ef3c520ec_1347x831.png) ## 总结 递归调用是有代价的:函数调用+系统栈空间