【Java學習筆記】遞歸

遞歸(recursion

思想:把一個復雜的問題拆分成一個簡單問題和子問題,子問題又是更小規模的復雜問題,循環往復

本質:棧的使用

遞歸的注意事項


遞歸的內存機制分析

代碼示例


public class Recursion01 {public static void main(String[] args) {Tt1 = newT();t1.test(4);//輸出什么? n=2 n=3 n=4}}class T {public void test(int n) {if (n > 2) {test(n- 1);}System.out.println("n=" + n);}
}

內存視圖分析

在這里插入圖片描述


遞歸實例

案例一:階乘問題(factorial

import java.util.Scanner;
public class recursion {public static void main(String[] args){Scanner input = new Scanner(System.in);object object = new object();System.out.print("input a number:");long n = input.nextLong();long result = object.factorial(n);System.out.print("factorial(" + n + ") is:" + result);}
}class object{public long factorial(long n){if(n == 1){return 1;}else{return n * factorial(n - 1);}}
}

案例二:猴子吃桃問題

有一堆桃子,猴子第一天吃了其中的一半,并再多吃了一個!以后每天猴子都吃其中的一半,然后再多吃一個。當到第 10 天時,想再吃時(即還沒吃),發現只有 1 個桃子了。問題:最初共多少個桃子?

public class recursion {public static void main(String[] args){method t = new method();int res = t.peach(1);System.out.print(res);}
}class method{public int peach(int day){if(day == 10){return 1;} else if(day >= 1 && day <= 9){return ( peach(day + 1) + 1 ) * 2;   // 枚舉每天的情況找規律得到}else{return -1;}}
}

案例三:斐波那契數列

1,1,2,3,5,8,13…給你一個整數 n,求出它的值是多少?

特點:從第三個數開始,后一個數等于前面兩個數之和

//斐波那契數列:1,1,2,3,5,8,13...public class recursion {public static void main(String[] args){method t = new method();int res = t.fibonacci(10);System.out.print(res);}
}class method{public int fibonacci(int n){if(n == 1 || n == 2){return 1;}else{return fibonacci(n - 1) + fibonacci(n - 2);}}
}//輸出:55

案例四;漢諾塔

有趣的小故事

在這里插入圖片描述

思路分析:可以把這個問題拆分

//斐波那契數列:1,1,2,3,5,8,13...public class recursion {public static void main(String[] args){tower t = new tower();t.move(3, 'a', 'b', 'c');}
}class tower{// 移動的圓盤個數, A塔 ,B塔 , C塔public void move(int num, char a, char b, char c){if(num == 1){System.out.println(a + "->" + c);}else{// 把上面的 n-1 個圓盤從 a塔 移動到 b塔,中間借助 c 塔move(num -1, a, c, b);// 把最下面的圓盤移動到 c塔System.out.println(a + "->" + c);// 把 b塔 的所有盤移動到 c塔,中介借助 a塔move(num -1, b, a, c);}}
}//輸出
a->c
a->b
c->b
a->c
b->a
b->c
a->c

迷宮問題

在這里插入圖片描述

思路:運用二維數組表示迷宮,初始位置為(1,1),走到出口處,標記路線

代碼示例

public class migong {public static void main(String[] args){int[][] map = new int[8][7];//標記墻面的部分for(int i = 0; i < 8; i++){map[i][0] = 1;map[i][6] = 1;}for(int i = 0; i < 7; i++){map[0][i] = 1;map[7][i] = 1;}map[3][1] = 1;map[3][2] = 1;// 回溯測試:輔助理解方法調用完成后棧空間釋放,是如何返回的
//        map[2][2] = 1;// 封閉路徑,測試結果
//        map[2][1] = 1;
//        map[2][2] = 1;
//        map[1][2] = 1;// 調用方法t finder = new t();finder.findway(map,1,1); // 起點是(1,1)//打印找路結果for(int i = 0; i < map.length; i++){for(int j = 0; j < map[i].length; j++){System.out.print(map[i][j] + " ");}System.out.println("");}}
}class t{public boolean findway(int[][] map, int i, int j){// 找路策略:下右上左// 如果找到了就出口返回 trueif(map[6][5] == 7){return true;}else{if(map[i][j] == 0){//假設當前點使用探路策略可以走通,就說明可以和之前的點銜接起來構成一條可以走通的路線map[i][j] = 7;// 接著使用找路策略開始探路,驗證當前點開始是否可以走通//往下走if(findway(map, i+1, j)){return true;}// 往右走else if(findway(map, i, j+1)){return true;}// 往上走else if(findway(map, i-1, j)){return true;}// 往左走else if(findway(map, i, j-1)){return true;}// 都走不通,走過了但是走不通就標記為 3else{map[i][j] = 3;return false;}}else{  // 此時 map[i][j] = 1, 7, 3 ; 7 表示測試過了就不要再重復測試return false;}}}
}

理解:沒走到一個點,就會遞歸的使用下->右->上->左的方式進行探路,如果都走不通就會返回到上一次遞歸調用,繼續探路,指導找到出口為止

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

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

相關文章

滲透測試中的那些“水洞”:分析與防御

1. Nginx 版本泄露 風險分析&#xff1a; Nginx 默認會在響應頭中返回 Server: nginx/x.x.x&#xff0c;攻擊者可利用該信息匹配已知漏洞進行攻擊。 防御措施&#xff1a; 修改 nginx.conf 配置文件&#xff0c;隱藏版本信息&#xff1a;server_tokens off;使用 WAF 進行信息…

基于C#開發的適合Windows開源文件管理器

使用DDD從零構建一個完整的系統 推薦一個功能強大且直觀的開源文件管理器&#xff0c;適用于Windows平臺。 01 項目簡介 該項目是一個基于C#開發、開源的文件管理器&#xff0c;適用于Windows&#xff0c;界面UI美觀、方便輕松瀏覽文件。此外&#xff0c;支持創建和提取壓縮…

實習入職的總結

我是4月14號入職的&#xff0c;到現在差不多已經三個禮拜了&#xff0c;今天想總結一下這段時間的工作情況&#xff0c;并給學弟學妹們提供一些指引。 目前&#xff0c;我所在的公司是一家初創企業&#xff0c;專注于IPC安防領域。作為一名大專生&#xff0c;我深知自己的學歷在…

Ubuntu 系統上部署 Kubernetes 的完整指南

Ubuntu 系統上部署 Kubernetes 的完整指南 一、環境準備&#xff08;Ubuntu 22.04/24.04&#xff09;1. 系統初始化2. 安裝容器運行時&#xff08;containerd&#xff09;3. 安裝 Kubernetes 組件&#xff08;kubeadm, kubelet, kubectl&#xff09; 二、部署 Kubernetes 集群1…

partition_pdf 和chunk_by_title 的區別

from unstructured.partition.pdf import partition_pdf from unstructured.chunking.title import chunk_by_titlepartition_pdf 和 chunk_by_title 初看有點像&#xff0c;都在"分塊"&#xff0c;但是它們的本質完全不一樣。 先看它們核心區別 partition_pdfchun…

基于深度學習的醫療診斷輔助系統設計

標題:基于深度學習的醫療診斷輔助系統設計 內容:1.摘要 隨著醫療數據的爆炸式增長和深度學習技術的飛速發展&#xff0c;開發基于深度學習的醫療診斷輔助系統具有重要的現實意義。本研究的目的在于設計一個高效、準確的醫療診斷輔助系統&#xff0c;以輔助醫生進行更精準的診斷…

Matlab/Simulink - BLDC直流無刷電機仿真基礎教程(四) - PWM調制模擬

Matlab/Simulink - BLDC直流無刷電機仿真基礎教程&#xff08;四&#xff09; - PWM調制模擬 前言一、PWM調制技術基本原理二、仿真模型中加入PWM調制三、逆變電路MOS管添加體二極管四、模擬添加機械負載五、仿真模型與控制框圖文章相關模型文件下載鏈接參考鏈接 前言 本系列文…

Curl 全面使用指南

Curl&#xff08;Client URL&#xff09;是一個跨平臺命令行工具&#xff0c;支持多種協議&#xff08;HTTP/HTTPS/FTP/SFTP等&#xff09;&#xff0c;用于數據傳輸、API調試、文件上傳/下載等場景。以下從 核心功能、用戶疑問解答、高級技巧 三方面系統總結&#xff0c;并整合…

PyTorch中“原地”賦值的思考

在開發一個PyTorch模塊時&#xff0c;遇到了一個詭異的現象&#xff0c;將他描述出來就是下面這樣&#xff1a; f[..., :p_index - 1] f[..., 1:p_index] 這個操作將f張量的部分數值進行左移&#xff0c;我在模型訓練的時候還能正常跑&#xff0c;但是當我將模型部署到項目中…

什么是:云邊端一體化架構

什么是云邊端一體化架構 文章目錄 什么是云邊端一體化架構云、邊、端云計算邊緣計算終端設備 云邊端一體化協同云邊端一體化架構協同的流程云邊端一體化架構協同的應用云邊端一體化架構協同的價值云邊端一體化架構協同未來發展趨勢 云、邊、端 云&#xff08;Cloud&#xff09…

gephi繪圖

參考&#xff1a; 如何在Gephi中正確的顯示中文&#xff1f; Gephi繪制網絡圖初步探索 gephi 節點標簽 調節_圖分析與可視化-從Gephi開始

馬克·雷伯特:用算法讓機器人飛奔的人

名人說:路漫漫其修遠兮,吾將上下而求索。—— 屈原《離騷》 創作者:Code_流蘇(CSDN)(一個喜歡古詩詞和編程的Coder??) 馬克雷伯特:用算法讓機器人飛奔的人 一、天才的起點 在機器人領域,有一個名字如雷貫耳——馬克雷伯特(Marc Raibert)。作為波士頓動力公司(Boston…

三維裝配可視化界面開發筆記

三維裝配可視化界面開發筆記 項目概述 這是一個基于Vue.js和Three.js的三維裝配可視化系統&#xff0c;用于展示機械零部件的裝配和拆解過程。系統支持模型加載、拆解/裝配路徑生成、動畫展示和工藝流程圖生成等功能。 技術棧 前端框架: Vue 3 (使用組合式API)構建工具: Vi…

深?理解指針(8)

1.對上一篇的補充內容 typedef int* ptr_t #define PTR_T int* 這兩種寫法都是可以的 ptr_t p1, p2; //p1, p2 都是指針變量 PTR_T p3, p4; //p3 是指針變量, p4是整型變量 為什么p3 是指針變量, p4是整型變量呢&#xff1f; 因為PTR_T 真的被改為了 int* 在編譯器中…

neo4j暴露公網ip接口——給大模型聯通知識圖譜

特別鳴謝 我的領導&#xff0c;我的腦子&#xff0c;我的學習能力&#xff0c;感動了 1. 搭建知識圖譜數據庫&#xff08;見上一章博客&#xff09; 這里不加贅述了&#xff0c;請參考上一篇博客搭建 2. FastApi包裝接口 這里注意&#xff1a;NEO4J_URI不得寫http:,只能寫…

AI編程新選擇!VSCode + RooCode,超越Cursor?

在當今快節奏的開發環境中&#xff0c;AI編程助手已經成為提升開發效率的關鍵工具。然而&#xff0c;面對眾多選擇&#xff0c;開發者往往陷入糾結&#xff1a;如何在眾多AI編程工具中找到最適合自己的方案&#xff1f;尤其是當VSCode搭配RooCode時&#xff0c;相比Cursor&…

電子病歷高質量語料庫構建方法與架構項目(環境聆聽與自動化文檔生成篇)

電子病歷高質量語料庫的構建是一個復雜而系統的工程,涉及數據收集、清洗、標注、驗證等多個環節。在項目實施過程中,"環境聆聽"和"自動化文檔生成"是兩個關鍵支撐要素,前者確保項目能夠適應不斷變化的技術和業務環境,后者則保障項目過程的可追溯性和知…

Python協程入門指北

一、什么是協程&#xff1f; 協程&#xff08;Coroutine&#xff09;就像可以暫停執行的函數&#xff0c;能夠在執行過程中主動讓出控制權&#xff0c;等準備好后再繼續執行。 生活小例子 想象你在咖啡店排隊&#xff1a; 普通函數&#xff1a;必須一直排到取餐&#xff08…

mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz的下載安裝和使用

資源獲取鏈接&#xff1a; mysql-5.7.24-linux-glibc2.12-x86-64.tar.gz和使用說明資源-CSDN文庫 詳細作用 數據庫服務器的核心文件&#xff1a; 這是一個壓縮包&#xff0c;解壓后包含 MySQL 數據庫服務器的可執行文件、庫文件、配置文件模板等。 它用于在 Linux 系統上安裝…

C++筆記-繼承(下)(包含派生類的默認成員函數,菱形繼承等)

一.派生類的默認成員函數 1.14個常見默認成員函數 默認成員函數&#xff0c;默認的意思就是指我們不寫&#xff0c;編譯器會自動為我們生成一個&#xff0c;那么在派生類中&#xff0c;這幾個成員函數是如何生成的呢&#xff1f; 1.派生類的構造函數必須調用基類的構造函數初…