持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情
链表和递归
递归
-
本质上,将原来的问题,转换为更小的同一问题
-
举例:数组求和
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([])最基本的问题
JS写一个sum的递归求法
递归就是将一个复杂问题,转换成一层一层的小问题,最后变为一个基本问题
难点就在,如何把复杂问题转换为小问题
链表天然的递归性
相关题目
力扣203题
这道题大家使用普通的链表遍历的方法都可以写出来
但如果改编成递归的思路的话,可能对初学者有点小难度
递归思路:
将整个链表看成是
head和head.next的组成。把链表分成很多个小块,最后一个最基础的问题是head ===null的时候。然后从后往前,判断head.val是否符合要求,进行删除或保留,成为上一层的head.next
这道题理解了之后就算是你递归已经入门了!
算法待补充......
递归的微观解读
回顾一下以前说的
function A(){
...
B()
...
}
function B(){
...
C()
...
}
function C(){
...
...
...
}
程序调用的系统栈就像上面。
递归调用和这种子函数的调用本身没有区别。不过是子函数调用的是别的函数,递归调用的是自己
简化一下上面的Sum递归算法
function sum(arr, left) {
if (left === arr.length) {
return 0;
}
let x = sum(arr, left + 1)
let res = arr[left] + x
return res
}
理解递归的时候,可以不需要去硬想那个运算过程。可以用一个很小的集来测试,并进行纸笔画出这个过程
理解小问题和最基础解是什么。(实践出真知)
在往后的算法内容中,不论是动态规划还是回溯,递归等等都需要递归的支持,早一步理解递归并加以运用是很重要的
\