演算法之遞迴

2022-07-17 01:51:06 字數 2476 閱讀 9276

什麼是遞迴?遞迴是一種演算法思想。從字面上看,遞迴包含兩層含義,傳遞和回歸。現實中有很多問題,只是傳遞而不用回歸。比如說,軍訓時,每天的一項訓練:」報數」。報數從頭到尾,依次傳遞,到最後乙個人停止,這時候軍官就知道了總體人數是多少,有沒有少人。假如,隊伍中有人想知道自己是幾號,怎麼辦呢?問下旁邊的人,如果旁邊的人說自己是「n」號,那麼自己是「n+1」號。如果旁邊的人不知道自己的號,那麼他會繼續問他旁邊的人,以此類推,知道某個人知道自己是多少號,然後把這個號往回傳回傳其實就是報數。用一段程式表示:

public

static

int getpeoplecount(int

n)

有人問了,你這還用得著遞迴嗎?直接迴圈搞定。我說此時用迴圈意義變了,那軍官從第乙個人數到最後乙個人,不就是很累嗎?遞迴(報數)效率多高啊。軍官自己數的話,相當於每次指標移動。在現實當中不可取,原因不光是累,還有乙個致命的原因,就是大家都是迷彩服,數數肯定花眼了,難免出錯。

好了,遞迴可以用來數數,我們的迴圈當然可以數數,而且迴圈效率肯定高。放到計算機中,這只是不同的演算法而已。

要算乙個數的階乘,怎麼算呢?

public

static

int getnumber(int

n)

和上面的數數多麼相似啊,只是遞迴的時候函式變了而已。為了程式的正確性,小測一下,求5的階乘:

有人說,迴圈也可以啊,效率也高,那我們改為迴圈:

public

static

int getnumber(int

n)

return

result;

}

的確根據階乘的定義,可以改為迴圈。

有乙個很經典的問題,那就是斐(fei)波那契數列(兔子總數) 1,1,2,3,5,8,13..這個數列的特點就是從第三個數開始,每一項都是前兩項之和。那這個數列跟兔子又有什麼聯絡呢,原來還有這麼個問題:

有一對兔子,從出生後第三個月起每個月都生一對兔子,小兔子長到第三個月後又生一對兔子,假如兔子都不死,每個月兔子對數為多少? 

第乙個月:1對; 

第二個月:1對; 

第三個月:2對; 

第四個月:3對: 

第五個月:5對: 

第六個月:8對;

請問第五個月,為什麼是5對?那是因為自己生了一對,在第三個月生下的一對兔子,在第五個月開始生了一對兔子,所以加起來就增加了2對兔子,因此是5,請問第20月的時候,一共有多少兔子?要讓人算,恐怕得費點事情了,好在我們發現這個兔子數的規律就是斐(fei)波那契數列。

程式編寫為:

public

static

int getnumber(int

n)

第20個月兔子總數:

這麼多啊,果然非人力所為,那怎麼知道這個方法正確呢?測試下,第6個月:

這段程式依然可以改為迴圈,就不用寫了,為什麼我一直把遞迴和迴圈比較呢?那是因為我曾經面試的時候,有個面試官問我迴圈和遞迴有什麼不同,遞迴在什麼時候用,我當時一臉懵逼,心裡嘀咕,該用遞迴時自然用遞迴。他給的結論是:能用遞迴的,就能用迴圈。

果真是這樣的嗎?

1、給定乙個資料夾,找出下面所有的檔案

2、遍歷二叉樹

你給我來個迴圈試試。這個我就確實用迴圈寫不出來,為什麼呢?因為之前的例子,都是數學問題,有明顯的規律可尋,但是遍歷檔案和二叉樹沒有這樣的規律,而且我無法確定迴圈多少次,什麼時候才能迴圈結束。也許有某些高人能寫出來。

附:遞迴遍歷檔案

1

///2

///獲取目錄path下所有子檔名

3/// 4

public

static listgetallfiles(string path)515

//所有子目錄名

16string dirs =system.io.directory.getdirectories(path);

17foreach (string dir in

dirs)

1824}25

}26return

filenames;

27 }

演算法之遞迴

自從學了c語言,遞迴不得解。自淺學習演算法,遞迴得已解。很多書上都這麼寫的,遞迴 就是間接呼叫自己或直接呼叫自己的過程叫遞迴。話的確沒錯,初見還是較難理解,所以一般會給乙個斐波那契數列什麼的作為經典案例,不得不說我當初看的時候四個字 頭皮發麻 後來慢慢接觸多了,也不覺得如何。所謂遞迴 就是呼叫自己,...

演算法之 遞迴

遞迴在程式語言中簡單的理解是 方法自己呼叫自己 描敘遞迴就是自己呼叫自己,不過需要注意的地方,需要給定跳出條件 示例 1 簡單遞迴 public class test1 public static void fa int i system.out.println i fa i 1 描敘 什麼是三角數...

python演算法之遞迴演算法

coding utf 8 import numpy as np 遞迴演算法 i 0 def my recursion list,n global i try if list i n 基線條件 return i,i 1 else 遞迴條件 i 1 return my recursion list,n ...