十六 递归
Posted ltfxy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了十六 递归相关的知识,希望对你有一定的参考价值。
递归:本质上是将原来的问题转化为更小的同一问题。
递归的两个步骤:
- 一、求解最基本问题
- 二、把原问题转化成更小的问题,构建递归过程,把最小规模的解,构建称为原问题的解
示例:递归解决数组求和问题:
package com.lt.datastructure.LinkedList; /** * 示例:利用递归为数组求和 */ 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[] arr = {1,2,3,4,5,6}; System.out.println(sum(arr)); } }
利用递归解决LeetCode203:
链表的天然递归性:
0--->一个更短的链表,少了一个节点的原链表
代码实现:
package com.lt.datastructure.LinkedList; public class Solution3 { /* * 如果head为空,返回Null * res 为去掉第一个结点的子链表 * 如果head的值为val,返回res,删除了第一个结点,后接子链表 * 如果head的值不为val,保留,返回第一个结点,将head后的删除val的子链表接上 * 即:head后指针指向res:head.next = res * */ public static ListNode removeElements(ListNode head, int val) { //空链表,或者链表遍历判断完成 if(head == null){ return null; } head.next = removeElements(head.next, val); return head.val == val? head.next : head; // //将原问题转换成转换为更小的问题 // ListNode res = removeElements(head.next,val); // //如果头结点为val,调用res删除,从下一个结点开始继续调用 // if(head.val == val){ // return res; // }else{ // //如果头结点不为val,保留头结点,从下一个结点开始判断 // //head.next指向去掉结点的子链表 // head.next = res; // return head; // } } public static void main(String[] args) { int[] nums = {1,2,3,6,4,5,6}; ListNode head = new ListNode(nums); System.out.println(head); ListNode res = removeElements(head, 6); System.out.println(head); } }
以上是关于十六 递归的主要内容,如果未能解决你的问题,请参考以下文章