數據結構與算法-遞歸

單路遞歸

二分查找

/*** 主函數:執行二分查找。* * @param a 要搜索的數組(必須是已排序的)* @param target 目標值* @return 返回目標值在數組中的索引;如果未找到,則返回 -1*/
public static int binarySearch(int[] a, int target) {// 從數組的第一個元素到最后一個元素開始查找return recursion(a, target, 0, a.length - 1);
}/*** 輔助遞歸函數:執行實際的二分查找操作。* * @param a 要搜索的數組* @param target 目標值* @param i 左邊界索引* @param j 右邊界索引* @return 返回目標值在數組中的索引;如果未找到,則返回 -1*/
public static int recursion(int[] a, int target, int i, int j) {// 如果左邊界索引大于右邊界索引,說明沒有找到目標值if (i > j) {return -1;}// 計算中間點,使用無符號右移避免溢出int m = (i + j) >>> 1;// 檢查中間點的值是否等于目標值if (target < a[m]) {// 如果目標值小于中間點的值,在左半部分繼續查找return recursion(a, target, i, m - 1);} else if (a[m] < target) {// 如果目標值大于中間點的值,在右半部分繼續查找return recursion(a, target, m + 1, j);} else {// 找到目標值,返回其索引return m;}
}

冒泡排序

/*** 優化版冒泡排序的遞歸實現。* * @param a 要排序的數組* @param low 排序范圍的起始索引(包含)* @param high 排序范圍的結束索引(包含)*/
private static void bubble(int[] a, int low, int high) {// 如果起始索引等于結束索引,說明已經沒有需要排序的部分了,直接返回if(low == high) {return;}int j = low; // 初始化j為low,用于記錄最后一次交換的位置// 遍歷從low到high-1的元素for (int i = low; i < high; i++) {// 如果當前元素大于下一個元素,則交換它們的位置if (a[i] > a[i + 1]) {swap(a, i, i + 1); // 調用swap方法交換元素j = i; // 更新最后一次交換的位置}}// 遞歸調用bubble方法,繼續對未排序部分進行排序// 注意:這里使用j而不是high作為新的high值,因為j之后的元素已經是有序的bubble(a, low, j);
}/*** 交換數組中兩個元素的位置。* * @param a 要操作的數組* @param i 第一個元素的索引* @param j 第二個元素的索引*/
private static void swap(int[] a, int i, int j) {int t = a[i]; // 暫存第一個元素a[i] = a[j];  // 將第二個元素賦值給第一個位置a[j] = t;     // 將暫存的第一個元素賦值給第二個位置
}

插入排序

/*** 插入排序的遞歸實現。* * @param a 要排序的數組* @param low 排序范圍的起始索引(包含)* @param high 排序范圍的結束索引(包含)*/
private static void insertion(int[] a, int low, int high) {// 基本情況:如果low大于high,說明已經沒有需要排序的部分了,直接返回if (low > high) {return;}// 保存當前元素值,并從low-1位置開始向前遍歷int t = a[low];int i = low - 1;// 向前遍歷數組,找到t應該插入的位置while (i >= 0 && a[i] > t) {  // 修正比較條件為a[i] > ta[i + 1] = a[i];           // 將較大的元素向后移動i--;}// 如果找到了一個比t小的位置,或者已經到達數組開頭,則將t插入到正確位置if (i + 1 != low) {a[i + 1] = t;}// 遞歸調用insertion方法,處理下一個元素insertion(a, low + 1, high);
}

?多路遞歸

斐波那契數列-Leetcode 509

斐波那契數?(通常用?F(n)?表示)形成的序列稱為?斐波那契數列?。該數列由?0?和?1?開始,后面的每一項數字都是前面兩項數字的和。也就是:

F(0) = 0,F(1)?= 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1

給定?n?,請計算?F(n)?。

示例 1:

輸入:n = 2
輸出:1
解釋:F(2) = F(1) + F(0) = 1 + 0 = 1

示例 2:

輸入:n = 3
輸出:2
解釋:F(3) = F(2) + F(1) = 1 + 1 = 2

示例 3:

輸入:n = 4
輸出:3
解釋:F(4) = F(3) + F(2) = 2 + 1 = 3

?

/*** 計算第n個斐波那契數。* * @param n 斐波那契數列中的位置(從0開始)* @return 第n個斐波那契數*/
public static int fib(int n) {// 基本情況1:當n為0時,返回0if (n == 0) {return 0;}// 基本情況2:當n為1時,返回1if (n == 1) {return 1;}// 遞歸調用:計算第n個斐波那契數,它是前兩個斐波那契數之和return fib(n - 1) + fib(n - 2);  // 修正方法名從f改為fib
}

楊輝三角-Leetcode 118

給定一個非負整數?numRows生成「楊輝三角」的前?numRows?行。

在「楊輝三角」中,每個數是它左上方和右上方的數的和。

示例 1:

輸入: numRows = 5
輸出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]

示例?2:

輸入: numRows = 1
輸出: [[1]]

?

import java.util.ArrayList;
import java.util.List;class Solution {/*** 生成帕斯卡三角形的前 numRows 行。** @param numRows 帕斯卡三角形的行數* @return 包含帕斯卡三角形各行的列表*/public List<List<Integer>> generate(int numRows) {List<List<Integer>> triangle = new ArrayList<>();if (numRows <= 0) {return triangle;}// 逐行構建帕斯卡三角形for (int i = 0; i < numRows; i++) {List<Integer> row = new ArrayList<>(i + 1);// 每一行的第一個和最后一個元素總是 1for (int j = 0; j <= i; j++) {if (j == 0 || j == i) {row.add(1);} else {// 當前行的元素是上一行相鄰兩個元素之和row.add(triangle.get(i - 1).get(j - 1) + triangle.get(i - 1).get(j));}}triangle.add(row);}return triangle;}
}

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/894985.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/894985.shtml
英文地址,請注明出處:http://en.pswp.cn/news/894985.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

軟中斷和tasklet的區別是什么?

軟中斷和 tasklet 都是 Linux 內核中用于實現異步事件處理的機制&#xff0c;它們的主要區別如下&#xff1a; 實現機制 軟中斷&#xff1a;是一種基于軟件觸發的中斷機制&#xff0c;在內核中是一組靜態定義的、預先分配好的軟中斷向量。每個軟中斷都有一個唯一的編號和對應…

Termux安裝ssh實現電腦ssh

Termux下載 點擊下載 在 Termux 中安裝并使用 SSH&#xff0c;按照以下步驟操作&#xff1a; 1. 更新軟件包列表 pkg update && pkg upgrade2. 安裝 OpenSSH pkg install openssh3. 設置 SSH 密碼&#xff08;必須&#xff0c;否則無法使用 SSH 服務器&#xff09…

深入理解 C++17 std::is_swappable

文章目錄 深入理解 C17 std::is_swappable引言std::is_swappable 概述std::is_swappable 的工作原理std::is_swappable 的變體注意事項結論 深入理解 C17 std::is_swappable 引言 在 C 編程中&#xff0c;交換兩個對象的值是一個常見的操作。為了確保代碼的通用性和安全性&am…

51單片機之馮·諾依曼結構

一、概述 8051系列單片機將作為控制應用最基本的內容集成在一個硅片上&#xff0c;其內部結構如圖4-1所示。作為單一芯片的計算機&#xff0c;它的內部結構與一臺計算機的主機非常相似。其中微處理器相當于計算機中的CPU&#xff0c;由運算器和控制器兩個部分構成&#xff1b;…

w~Transformer~合集5

我自己的原文哦~ https://blog.51cto.com/whaosoft/12406495 #transformer~x1 太可怕了都到6了 太強~~ DeepMind 表示&#xff0c;他們提出的算法蒸餾&#xff08;AD&#xff09;是首個通過對具有模仿損失的離線數據進行順序建模以展示上下文強化學習的方法。同時基于觀察…

c#對接deepseek 聊天AI接口

注意&#xff1a;不是免費 對接文檔&#xff1a;對話補全 | DeepSeek API Docs 注冊地址&#xff1a;DeepSeek 申請key 在線請求示例 apifox deepseek - deepseek

23.PPT:校攝影社團-攝影比賽作品【5】

目錄 NO12345? NO6 NO7/8/9/10? 單元格背景填充表格背景填充文本框背景填充幻燈片背景格式設置添加考生文件夾下的版式 NO12345 插入幻燈片和放入圖片?快速&#xff1a;插入→相冊→新建相冊→文件→圖片版式→相框形狀→調整邊框寬度左下角背景圖片&#xff1a;視圖→…

創新領先!珈和科技獲評省級企業技術中心

為充分發揮中小企業創新主體作用&#xff0c;提高自主創新、集成創新和引進消化吸收再創新能力&#xff0c;增強創新驅動發展的動力&#xff0c;做好專精特新“小巨人”企業的培育工作。 近日&#xff0c;湖北省經信廳對申報2024年湖北省中小企業技術中心的企業進行審核認定并…

Android車機DIY開發之軟件篇(十二)編譯Automotive OS錯誤(3)

Android車機DIY開發之軟件篇(十二)編譯Automotive OS錯誤(3) 問題 [ 85% 113538/132897] //hardware/interfaces/neuralnetworks/1.1/utils:neuralnetworks_utils_hal_1_1 clang src/Device.cpp [ 85% 113539/132897] //hardware/interfaces/neuralnetworks/1.1/utils:neural…

初次體驗Tauri和Sycamore (2)

原創作者&#xff1a;莊曉立&#xff08;LIIGO&#xff09; 原創時間&#xff1a;2025年2月8日&#xff08;首次發布時間&#xff09; 原創鏈接&#xff1a;https://blog.csdn.net/liigo/article/details/145520637 版權所有&#xff0c;轉載請注明出處。 關鍵詞&#xff1a;Sy…

iPhone 在華銷量大幅下挫

iPhone在喬布斯時代締造的神話在中國正逐漸走向沒落&#xff0c;擠牙膏式的升級方式類似于諾基亞的N70系列&#xff0c;毫無新意的創新能力&#xff0c;求穩著陸的經營理念&#xff0c;工藝和美學不再獨領風騷&#xff0c;甚至拍照領域和AI增強計算&#xff0c;折疊屏等技術領域…

vs封裝dll 給C#使用

一&#xff0c;vs創建控制臺應用 創建控制臺應用得好處時&#xff0c;我們可以自己測試接口&#xff0c;如果接口沒有問題&#xff0c;改成dll重新編譯一遍就可以。 二&#xff0c; 創建一個c 類&#xff0c;將所需提供得功能 封裝到類中。 這樣可以將 所有功能&#xff0c;進…

懸鏈線的方程及其推導過程

懸鏈線的方程及其推導過程 懸鏈線是描述理想鏈條或柔軟繩索在重力作用下的自然形態的數學曲線。其特征在于&#xff1a;如果將一根均勻、不可伸長的鏈條兩端懸掛在固定點上&#xff0c;鏈條所呈現的形狀就會遵循一種特殊的曲線&#xff0c;這個曲線就是懸鏈線。 懸鏈線的方程…

緊跟潮流,將 DeepSeek 集成到 VSCode

Visual Studio Code&#xff08;簡稱 VSCode&#xff09;是一款由微軟開發的免費開源代碼編輯器&#xff0c;自 2015 年發布以來&#xff0c;憑借其輕便、強大、且擁有豐富擴展生態的特點&#xff0c;迅速成為了全球開發者的首選工具。VSCode 支持多平臺操作系統&#xff0c;包…

算法基礎之八大排序

文章目錄 概要1. 冒泡排序&#xff08;Bubble Sort&#xff09;2. 選擇排序&#xff08;Selection Sort&#xff09;3. 插入排序&#xff08;Insertion Sort&#xff09;4. 希爾排序&#xff08;Shell Sort&#xff09;5. 歸并排序&#xff08;Merge Sort&#xff09;6. 快速排…

html 列動態布局

樣式說明&#xff1a; /* 列動態布局&#xff0c;列之間以空格填充 */ li {display: flex;/* flex-direction: column; */justify-content: space-between; }

(python)如何看自己安裝的包的版本

linux pip list | grep "numpy\|scipy\|tensorflow\|keras"windows環境下 pip list | findstr "numpy scipy tensorflow keras"輸出 numpy 1.13.1 scipy 0.19.1 tensorflow-cpu 2.4.0 tensorflow-estimator 2.4.0 tensorflow-gpu 2.4.0

從O(k*n)到O(1):如何用哈希表終結多層if判斷的性能困局

【前言】 ??本文將以哈希表重構實戰為核心&#xff0c;完整展示如何將傳統條件匹配邏輯(上千層if-else判斷)轉化為O(1)的哈希表高效實現。通過指紋驗證場景的代碼級解剖&#xff0c;您將深入理解&#xff1a; ??1.哈希函數設計如何規避沖突陷阱 ??2.鏈式尋址法的工程實現…

離線統信系統的python第三方庫批量安裝流程

一、關于UOS本機 操作系統&#xff1a;UOS&#xff08;基于Debian的Linux發行版&#xff09; CPU&#xff1a;海光x86 二、具體步驟 1、在聯網的電腦上用控制臺的pip命令批量下載指定版本的第三方庫 方法A cd <目標位置的絕對路徑> pip download -d . --platform many…

第 26 場 藍橋入門賽

3.電子舞龍【算法賽】 - 藍橋云課 問題描述 話說這年頭&#xff0c;連舞龍都得電子化&#xff01;這不&#xff0c;藍橋村的老程序員王大爺突發奇想&#xff0c;用LED燈帶和一堆傳感器鼓搗出了一條“電子舞龍”&#xff0c;它能根據程序指令在村里的廣場上“翩翩起舞”。 廣…