zoukankan      html  css  js  c++  java
  • 递归调用 LeetCodel例题分析

    一看就会,一写就废?详解递归

    1. 前言

    递归解法总是给人一种“只可意会不可言传”的感觉,代码一看就懂,自己动手一写就呆住了,很难受。究其原因,一是我们练习不够,二是理解不够。

    2. 什么是递归?

    递归的例子在平时生活中很容易见到,比如:

    f(x) = f(x-1)+x;
    

    如果x=3;带入上面的数学公式

    f(3) = f(2)+3;
    f(3) = f(1)+2+3;
    f(3) = f(0)+1+2+3;
    因为f(0)=1;
    f(3) = 1+1+2+3;
    

     如果写成java的话

    public int fx(int x){
            if(x==0){
                return 1;
            }else{
                x = x + reverse(x-1);
            }
            return x;        
    }
    • 递归函数必须要有终止条件,否则会出错;
    • 递归函数先不断调用自身,直到遇到终止条件后进行回溯,最终返回答案。

    请看   面试题24. 反转链表  看看自己会了吗

    定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

     1. 首先找到递归的出口

    就是找到链表最后一个节点(尾结点),我们要反转当前的链表,就必须从尾结点开始,因为链表的性质就是:通过头结点来找到后面的节点进行操作,CRUD都需要从头结点开始找。

    • 递归函数必须要有终止条件,否则会出错;
    • 递归函数先不断调用自身,直到遇到终止条件后进行回溯,最终返回答案

    1. 终止条件是当前节点或者下一个节点==null
    2. 在函数内部,改变节点的指向,也就是 head 的下一个节点指向 head 递归函数那句
    head.next.next = head
    

      很不好理解,其实就是 head 的下一个节点指向head。
      递归函数中每次返回的 cur 其实只最后一个节点,在递归函数内部,改变的是当前节点的指向。

    完整的代码

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) { val = x; }
     * }
     */
    class Solution {
        public ListNode reverseList(ListNode head) {
            if(head==null||head.next==null) return head;
            ListNode cur = reverseList(head.next);
            head.next.next=head;
            head.next=null;
            return cur;
        }
    }
    

      

  • 相关阅读:
    uniapp IOS使用uni.getLocation获取不到具体城市名字
    uniapp 打开[ios/安卓]GPS定位权限
    for循环中利用计时器使用let和var
    uniapp 调起底部输入框textarea聊天页面被键盘顶起
    父子组件传布尔类型,发现有问题一直传字符串
    Kafka学习-基础知识
    剑指offer-删除链表中重复的节点
    LEACH协议原文详解
    主流机器学习框架
    算法工程师-职位描述
  • 原文地址:https://www.cnblogs.com/ScarecrowAnBird/p/13084291.html
Copyright © 2011-2022 走看看