基础-递归
遞歸原理
一個(gè)簡單的基本案例(basic case)(或一些案例) ——?能夠不使用遞歸來產(chǎn)生答案的終止方案。---終止條件 一組規(guī)則,也稱作遞推關(guān)系(recurrence relation),可將所有其他情況拆分到基本案例。 ? ? ? ?? ---遞推關(guān)系
printReverse(str[1...n-1]):以相反的順序打印子字符串?str[1...n-1]?。 print(str[0]):打印字符串中的第一個(gè)字符。
遞歸是一種解決問題的有效方法,在遞歸過程中,函數(shù)將自身作為子例程調(diào)用
你可能想知道如何實(shí)現(xiàn)調(diào)用自身的函數(shù)。訣竅在于,每當(dāng)遞歸函數(shù)調(diào)用自身時(shí),它都會(huì)將給定的問題拆解為子問題。
遞歸調(diào)用繼續(xù)進(jìn)行,直到到子問題無需進(jìn)一步遞歸就可以解決的地步。
為了確保遞歸函數(shù)不會(huì)導(dǎo)致無限循環(huán),它應(yīng)具有以下屬性:
注意,函數(shù)可能會(huì)有多個(gè)位置進(jìn)行自我調(diào)用。
?
示例
讓我們從一個(gè)簡單的編程問題開始:
以相反的順序打印字符串。
你可以使用迭代的辦法輕而易舉地解決這個(gè)問題,即從字符串的最后一個(gè)字符開始遍歷字符串。但是如何遞歸地解決它呢?
首先,我們可以將所需的函數(shù)定義為?printReverse(str[0...n-1]),其中?str[0]?表示字符串中的第一個(gè)字符。然后我們可以分兩步完成給定的任務(wù):
請(qǐng)注意,我們?cè)诘谝徊街姓{(diào)用函數(shù)本身,根據(jù)定義,它使函數(shù)遞歸。
例子:
private static void printReverse(char [] str) {helper(0, str); }private static void helper(int index, char [] str) {if (str == null || index >= str.length) {return;}// 這可以理解為,先輸出當(dāng)前index之后索引的字符(即index+1),且該方法可以宏觀理解為,已經(jīng)輸出后后邊所有的字符了,接下來輸出當(dāng)前字符 helper(index + 1, str);System.out.print(str[index]); }?
遞歸例子:
一、反轉(zhuǎn)字符串
問題:
編寫一個(gè)函數(shù),其作用是將輸入的字符串反轉(zhuǎn)過來。輸入字符串以字符數(shù)組 char[] 的形式給出。 不要給另外的數(shù)組分配額外的空間,你必須原地修改輸入數(shù)組、使用 O(1) 的額外空間解決這一問題。 你可以假設(shè)數(shù)組中的所有字符都是 ASCII 碼表中的可打印字符。 package com.example.demo;public class TestString0001 {public void reverseString(char[] s) {int len = s.length;swap(s, 0, len - 1);}private void swap(char[] s, int left, int right) {if (left > right) {return;}char temp = s[left];s[left] = s[right];s[right] = temp;swap(s, left+1, right-1);}public static void main(String[] args) {TestString0001 t = new TestString0001();char[] arr = {'H', 'a', 'n', 'n', 'a', 'h'};t.reverseString(arr);for (char c : arr) {System.out.println(c);}} }?
二、問題
兩兩交換鏈表中的節(jié)點(diǎn)給定一個(gè)鏈表,兩兩交換其中相鄰的節(jié)點(diǎn),并返回交換后的鏈表。 你不能只是單純的改變節(jié)點(diǎn)內(nèi)部的值,而是需要實(shí)際的進(jìn)行節(jié)點(diǎn)交換。 class Solution {public ListNode swapPairs(ListNode head) {if (head == null || head.next == null) {return head;}ListNode temp = head;head = head.next;temp.next = head.next;head.next = temp;//下一個(gè)交換head.next.next = swapPairs(head.next.next);return head;} }?
?
?
?
相關(guān):leetcode有關(guān)遞歸:
https://leetcode-cn.com/explore/featured/card/recursion-i/256/principle-of-recursion/1101/
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
- 上一篇: leetcode-15-三数之和
- 下一篇: leetcode-26-删除排序数组中的