日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基础-递归

發(fā)布時(shí)間:2024/9/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基础-递归 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(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)具有以下屬性:

  • 一個(gè)簡單的基本案例(basic case)(或一些案例) ——?能夠不使用遞歸來產(chǎn)生答案的終止方案。---終止條件
  • 一組規(guī)則,也稱作遞推關(guān)系(recurrence relation),可將所有其他情況拆分到基本案例。 ? ? ? ?? ---遞推關(guān)系
  • 注意,函數(shù)可能會(huì)有多個(gè)位置進(jìn)行自我調(diào)用。

    ?

    示例


    讓我們從一個(gè)簡單的編程問題開始:

    以相反的順序打印字符串。

    你可以使用迭代的辦法輕而易舉地解決這個(gè)問題,即從字符串的最后一個(gè)字符開始遍歷字符串。但是如何遞歸地解決它呢?

    首先,我們可以將所需的函數(shù)定義為?printReverse(str[0...n-1]),其中?str[0]?表示字符串中的第一個(gè)字符。然后我們可以分兩步完成給定的任務(wù):

  • printReverse(str[1...n-1]):以相反的順序打印子字符串?str[1...n-1]?。
  • print(str[0]):打印字符串中的第一個(gè)字符。
  • 請(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é)

    以上是生活随笔為你收集整理的基础-递归的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。