基礎演算法 遞迴

2021-06-21 21:58:59 字數 2069 閱讀 2087

遞迴用處很廣,可以將複雜問題簡單化。

很多問題都可以使用遞迴演算法或結合遞迴演算法得到解決。

那麼,設計遞迴演算法的關鍵是什麼?  其關鍵之處在於,正確分析出2種型別的節點:出口節點和入口節點

一    演算法關鍵: 出口節點 , 入口節點

遞迴問題可看做是由各個節點構成,而所有節點只能分為出口節點、入口節點兩類。

1)出口節點:   可直接計算此節點的值,不需借助其他節點

那什麼情況下,不必再遞迴了呢?

確定結果了,自然就不用繼續遞迴了,這也是遞迴的出口, 遞迴的根基。 所以這個根基必須判斷好,這是遞迴是否成功的乙個關鍵之處。

因此,第乙個的關鍵是:確定哪些節點是出口節點。

2)入口節點: 無法直接計算此節點的值,但此節點的值可根據後續節點的值計算。

入口節點與後續節點的數學或邏輯關係, 且如何用遞迴方式表示這個關係,則是遞迴演算法的第二個關鍵。

二    什麼問題可以用遞迴來處理?

遞迴的過程,就是搜尋的過程,搜尋乙個個的節點,找到出口節點。

若問題滿足下面條件,則可遞迴解決:

a)  問題可看做為在很多節點中進行搜尋

b)  這些節點或者為出口節點 或者為入口節點

c)  入口節點和後續節點間的關係 可用遞迴方式描述

d)  出口節點在入口節點的後續路徑中

下面舉幾個例子:

1  遞增

第5個人的年齡比第4個的年齡大2歲,第4個人的年齡比第3個的年齡大2歲,第3個人的年齡比第2個的年齡大2歲,第2個人的年齡比第1個的年齡大2歲,第1個的年齡10歲.

[cpp]view plain

copy

intage(intn)  

2   階乘

5的階乘是4的階乘*5,4的階乘是3的階乘*4,3的階乘是2的階乘*3,2的階乘是1的階乘*2,1的階乘是1的時候。

[cpp]view plain

copy

intfac(intn)  

3  斐波那契數列

第乙個和第二個數分別為1和1,從第三個數開始,每個數等於其前兩個數之和(1,1,2,3,5,8,13…………)

[cpp]view plain

copy

intrabbitnum(intn)  

else

}4 漢諾塔

[cpp]view plain

copy

voidhannoi(intn,tchara,tcharb,tcharc)  

else

}5  將輸入的字元以相反順序列印出來

[cpp]view plain

copy

#include 

#include 

voidstrv(tchar* p);   

intmain();  

演算法基礎 遞迴演算法

遞迴演算法是將重複問題分解為同類的子問題而解決問題的方法,其核心思想是分治策略。簡單來說就是自己呼叫自己。直到達到退出遞迴的條件,則完成遞迴。1 找整個遞迴的終止條件 遞迴應該在什麼時候結束?3 本級遞迴應該做什麼 在這一級遞迴中,應該完成什麼任務?優點 遞迴的核心思想就是將乙個大問題,拆解成乙個小...

演算法基礎 遞迴

乙個函式呼叫其自身,就是遞迴 遞迴和普通函式呼叫一樣是通過棧實現的 替代多重迴圈 解決本來就是用遞迴形式定義的問題 將問題分解為規模更小的子問題進行求解 例題 n皇后問題 n皇后問題 輸入整數n,要求n個西洋棋的皇后,擺在n n的棋盤上,互相不能攻擊,輸出全部方案。輸入乙個正整數n,則程式輸出n皇后...

演算法 遞迴基礎

資料結構 int st n 記錄每個位置當前的狀態 0還沒考慮,1表示選它,2表示不選它 include include include include using namespace std const int n 16 int n int st n 記錄每個位置當前的狀態 0還沒考慮,1表示選它...