1. 程式人生 > >java 遞迴詳解

java 遞迴詳解

剛學java的時候通常難以理解遞迴程式設計的概念。遞迴思想之所以困難,原因在於它非常像是迴圈推理(circular reasoning)。它也不是一個直觀的過程;當我們指揮別人做事的時候,我們極少會遞迴地指揮他們。

對剛開始接觸計算機程式設計的人而言,這裡有遞迴的一個簡單定義:當函式直接或者間接呼叫自己時,則發生了遞迴。

遞迴是一種常見的解決問題的方法,寄把問題逐漸簡單化。遞迴的基本思想就是
“自己呼叫自己”,一個使用遞迴技術的方法會直接或間接的呼叫自己
遞迴構造包括兩個部分:
定義遞迴頭。什麼時候不呼叫自身方法,如果沒有頭,將陷入死迴圈
遞迴體。什麼時候需要呼叫自身方法

其實遞迴演算法很簡單,簡單點就是自己呼叫自己的方法,有條件判斷什麼時候停止!

遞迴的經典示例

計算階乘是遞迴程式設計的一個經典示例。計算某個數的階乘就是用那個數去乘包括 1 在內的所有比它小的數。例如,factorial(5) 等價於5*4*3*2*1,而 factorial(3) 等價於 3*2*1

階乘的一個有趣特性是,某個數的階乘等於起始數(starting number)乘以比它小一的數的階乘。例如,factorial(5) 與 5 * factorial(4) 相同。您很可能會像這樣編寫階乘函式:

package cn.itcast.heima2;

/**
 * 測試方法
 * @author lyy
 */
public class TraditionalThread {
	
	public static long factorial(int n){
		if(n == 1){//遞迴體
			return 1;
		}else{//遞迴頭
			return n*factorial(n-1);
		}
	}
	
		public static void main(String[] args) {
			long num = factorial(10);
			System.out.println(num);
		}
}	

示例二:
package cn.itcast.heima2;

/**
 * 測試方法
 * @author lyy
 */
public class TraditionalThread {
	
	private static int a = 0;
	
	public static void test01(){
		a++;
		System.out.println("test——"+a);
		if(a <= 10){//遞迴頭
			test01();
		}else{//遞迴體
			System.out.println("over!");
		}
	}
	
	public static void test02(){
		System.out.println("test02");
	}


	
		public static void main(String[] args) {
		test01();
		}
}	


好了基本上遞迴演算法就是以上的兩個方法,不喜勿噴!

相關推薦

java

剛學java的時候通常難以理解遞迴程式設計的概念。遞迴思想之所以困難,原因在於它非常像是迴圈推理(circular reasoning)。它也不是一個直觀的過程;當我們指揮別人做事的時候,我們極少會遞迴地指揮他們。 對剛開始接觸計算機程式設計的人而言,這裡有遞迴的一個簡

反轉單鏈表

反轉一個單鏈表。 示例: 輸入: 1->2->3->4->5->NULL 輸出: 5->4->3->2->1->NULL 方法一:三指標法 這種辦法實際上就是用next指標記住當前位置的後一個節點,然後

(STL字典序和非字典序全排列 )。

遞迴的定義就是函式本身呼叫自己,定義看起來很簡單,我感覺在具體問題中是很難實現的,首先這個思想也是很難懂的,具體的過程也是抽象的,對於ACM新手是很難搞懂的。 接下來,我就幾個例子來講一下我的見解。 在數學與電腦科學中,遞迴(Recursion)是指在函式的定義中使用函式自身的方法。實際上,

漢諾塔(必須經過中間柱子)與非與程式碼實現

首先介紹一下漢諾塔最初始的規則: 有三根相鄰的柱子,標號為A,B,C,A柱子從上到下按照金字塔狀疊放著n個不同大小的圓盤,現在把所有的盤子一個一個移動到柱子B上,並且每次移動同一根柱子上都不能出現大盤子在小盤子上方。 這是最初始的規則,實現的思路可以分為

資料結構與算法系列九(

1.引子 1.1.為什麼要學習資料結構與演算法? 有人說,資料結構與演算法,計算機網路,與作業系統都一樣,脫離日常開發,除了面試這輩子可能都用不到呀! 有人說,我是做業務開發的,只要熟練API,熟練框架,熟練各種中介軟體,寫的程式碼不也能“飛”起來嗎? 於是問題來了:為什麼還要學習資料結構與演算法呢? #理

程式設計師必備的基本演算法:

前言 遞迴是一種非常重要的演算法思想,無論你是前端開發,還是後端開發,都需要掌握它。在日常工作中,統計資料夾大小,解析xml檔案等等,都需要用到遞迴演算法。它太基礎太重要了,這也是為什麼面試的時候,面試官經常讓我們手寫遞迴演算法。本文呢,將跟大家一起學習遞迴演算法~ 什麼是遞迴?遞迴的特點遞迴與棧的關係遞迴

java.util包(二)——Connection接口

操作 相同 元素 叠代 cat roo soft true nbsp Connection接口介紹   Connection接口是java集合的root接口,沒有實現類,只有子接口和實現子接口的各種容器。主要用來表示java集合這一大的抽象概念。   Connection接

java對象

add splay view created 元素 繼承關系 外部 優化 csdn java對象詳解 內存布局 普通對象布局 數組的內存布局 內部類的內存布局 對象分解 對象頭-mark word(8字節) 實例數據 對齊填充(可選) java鎖分析

Java泛型

對象數組 整形 泛型方法 tty 接受 一個 div -m color 泛型的本質是參數化類型,也就是說所操作的數據類型被指定為一個參數。 假定我們有這樣一個需求:寫一個排序方法,能夠對整形數組、字符串數組甚至其他任何類型的數組進行排序,該如何實現? 答案是可以使用 Ja

Java常量池

回收 array 數值 編譯期 二進制格式 new 保持 占用 get 轉自:http://www.cnblogs.com/iyangyuan/p/4631696.html jvm虛擬內存分布圖: 程序計數器:JVM執行程序的流水線。 本地方法棧:JVM調用操作系統方法所

Java線程(一)

線程 thread runnable 程序、進程、線程的概念 程序(program):是為完成特定任務、用某種語言編寫的一組指令的集合。即指一段靜態的代碼,靜態對象。 進程(process):是程序的一次執行過程,或是正在運行的一個程序。動態過程:有它自身的產生、存在和消亡的過程。 如

Java反射機制

java 反射 反射機制 工廠模式 1反射機制是什麽反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱為java語言的反射機制。在面向對象的世界裏,萬事萬物皆對象.在ja

JAVA環境配置

指向 微軟 ssp cep 解釋 引入 bin testcase loader 步驟:一下載安裝JDK(註意版本)二配置環境變量 JAVA_HOME:JDK的安裝路徑 CLASSPATH:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\too

Java反射機制

ride length 數組大小 conf array arraycopy 動態調用 ray info Java反射機制詳解 |目錄 1反射機制是什麽 2反射機制能做什麽 3反射機制的相關API ·通過一個對象獲得完整的包名和類名 ·實例化Class類對象 ·獲

java虛擬機

image 種類 棧的操作 cms gc float align pool 不定 記錄 註: 此篇文章可以算是讀《深入理解Java虛擬機:JVM高級特性與最佳實踐》一書後的筆記總結加上我個人的心得看法。 整體總結順序沿用了書中順序,但多處章節用自己的話或直白或擴展的進行

java 常量池

例如 ava color str blog 註意 如果 .cn 運行 參考資料:http://www.cnblogs.com/holos/p/6603379.html 註意: 1.首先,我們平時在討論字符串新建問題時所說的常量池其實指的是全局字符串常量池。並不是運行時常量池

Java虛擬機——JVM常見問題總結

can 語言 嘗試 意思 是把 fff rom com serial 【正文】 聲明:本文只是做一個總結,有關jvm的詳細知識可以參考之前的系列文章,尤其是那篇:Java虛擬機詳解04—-GC算法和種類。那篇文章和本文是面試時的重點。 面試必問關鍵詞:JVM垃圾回收、類加載

java設計模式

創建對象 single 代理模式 man server pre factory 行為型模式 代理 設計模式: 設計模式(Design Pattern)是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結,使用設計模式是為了可重用代碼、讓代碼更容易被他人理解並且

Java Static關鍵字

會有 java 非靜態屬性 指向 style 關於 區域 當前 為什麽 先思考兩個問題: 1.為什麽要使用Static關鍵字? 2.加了Static關鍵字修飾後會有什麽不同? Static 一.為什麽要使用Static關鍵字? 這裏摘錄一下《Java編程思想(第四版)

java Random類

代碼實現 java 取余 ext deb 簡單 pri nbsp false java Random類位於java.util包下,主要用來生成隨機數,本文詳解介紹了Random類的用法,希望能幫到大家 Random類 (java.util) Random類中