遞迴 很常見的一種程式設計技巧

2021-10-06 22:44:19 字數 1676 閱讀 5855

優點:**表達力強,簡潔;

缺點:空間複雜度高,有堆疊溢位風險,存在重複計算可能,以及過多的函式呼叫會比較耗時;

乙個問題的解可以分解為幾個子問題的解;

例如 f(n)=f(n-1)+f(n-2);

這個問題與分解的子問題,除資料規模不同,求解思路完全一樣;

例如 f(n)=f(n-1)+f(n-2); n 、n-1 、 n-2只是資料不同但求解函式一樣都是f

存在遞迴終止條件;

例如 f(1)=1;

理解

寫出遞推公式,找到終止條件

遞迴其實就是乙個方程式:f(n) = f(n-1) + a;也就是說在設計遞迴的時候應該考慮下面三個方面:

求解f(n)的時候,假設f(n-1)已經求解出來了。我們不要去考慮f(n-1)是如何求解出來的。關鍵點在於找到遞迴的終止條件。

遞迴往往和分治法是分不開的。對於複雜的遞迴,往往將遞迴拆分,然後再合併。 步驟

寫乙個遞迴方法。

先寫判斷遞迴結束時候的操作;

再寫遞迴分解操作; 栗子

漢諾塔問題就是使用典型的遞迴思想。

先推導最簡單的f(2),從而推f(n)的解可以分為:

將 n-1 個圓盤從 from -> buffer

將 1 個圓盤從 from -> to

將 n-1 個圓盤從 buffer -> to

以上三步都是為了求解f(n),最後我們給出遞迴結束的條件。只有乙個圓盤的時候,只需一次移動操作即可from -> to。

/**

* 漢諾塔問題

*/public

static

void

move

(int n,string from,string buffer,string to)

move

(n-1

,from,to,buffer)

;move(1

,from,buffer,to)

;move

(n-1

,buffer,from,to)

;}

電影院問座位第幾排問題,f(n)=f(n-1)+1,f(1)=1,

/**

* 電影院座位排數問題

* @param n 前面一排

* @return

*/public

static

intask

(int n)

return

ask(n-1)

+1;}

1.警惕堆疊溢位:

遞迴用的是系統棧或者虛擬機器函式呼叫棧,棧空間一般都不大,

如果遞迴求解的資料規模很大,呼叫層次很深,一直壓入棧,就會有堆疊溢位的風險。

可以宣告乙個全域性變數來控制遞迴的深度,從而避免堆疊溢位。

2.警惕重複計算:

例如 f(n)=f(n-1)+f(n-2) , f(5)=(f4)+f(3),f(4)=f(3)+f(2),這裡f(3)重複計算

通過雜湊表來儲存已經求解過的值,從而避免重複計算。

有一種思念很幸福

有一種朋友,我想那是一種介乎於愛情與友情之間的感情,你會在偶爾的一時間默默地想念他,想起他時,心裡暖暖的,有乙份美好,有乙份感動。在憂愁和煩惱的時候,你會想起他,你很希望他能在你的身邊,給你安慰,給你理解,而你卻從沒有向他傾訴,你怕屬於自己的那份憂傷回妨礙他平靜的生活。你會因為一首歌曲,一種顏色,想...

思念是一種很玄的東東

有一種很玄的東東叫思念。思念是一種幸福的憂傷,是一種甜蜜的惆悵。思念是對昨日悠長的沉湎和未來美好的嚮往。思念是有距離的。沒有距離,便沒有思念。如果是空間的距離,那思念便是甜蜜的,甜蜜的笑著流淚。如果是心靈的距離,那思念便是苦澀的,苦澀的笑著流淚。如果是彼此的思念,那思念便是一種幸福。如果是單向的相思...

思念是一種很玄的東西

有一種很玄的東西叫思念。思念是一種幸福的憂傷,是一種甜蜜的惆悵。思念是對昨日悠長的沉湎和未來美好的嚮往。思念是有距離的。沒有距離,便沒有思念。如果是空間的距離,那思念便是甜蜜的,甜蜜的笑著流淚。如果是心靈的距離,那思念便是苦澀的,苦澀的笑著流淚。如果是彼此的思念,那思念便是一種幸福。如果是單向的相思...