链表和递归

68 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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的递归求法

image-20221001154445815

递归就是将一个复杂问题,转换成一层一层的小问题,最后变为一个基本问题

难点就在,如何把复杂问题转换为小问题

链表天然的递归性

image-20221001162507903

相关题目

力扣203题

image-20221001170839601

这道题大家使用普通的链表遍历的方法都可以写出来

image-20221001170858537

但如果改编成递归的思路的话,可能对初学者有点小难度

递归思路

image-20221001170928830

将整个链表看成是 headhead.next的组成。把链表分成很多个小块,最后一个最基础的问题是head ===null的时候。然后从后往前,判断head.val是否符合要求,进行删除或保留,成为上一层的 head.next

这道题理解了之后就算是你递归已经入门了!

算法待补充......

递归的微观解读

回顾一下以前说的

function A(){
    ...
    B()
    ...
}
​
function B(){
    ...
    C()
    ...
}
function C(){
    ...
    ...
    ...
}

程序调用的系统栈就像上面。

image-20221001233213625

递归调用和这种子函数的调用本身没有区别。不过是子函数调用的是别的函数,递归调用的是自己

简化一下上面的Sum递归算法

function sum(arr, left) {
    if (left === arr.length) {
        return 0;
    }
    let x = sum(arr, left + 1)
    let res = arr[left] + x
    return res
}

image-20221002000402329

image-20221001235759401

理解递归的时候,可以不需要去硬想那个运算过程。可以用一个很小的集来测试,并进行纸笔画出这个过程

理解小问题和最基础解是什么。(实践出真知)

在往后的算法内容中,不论是动态规划还是回溯,递归等等都需要递归的支持,早一步理解递归并加以运用是很重要的

\