C 實現遞迴演算法經典例項

2022-10-08 08:27:09 字數 2073 閱讀 1208

目錄

在數學與電腦科學中,遞迴是指在函式的定義中使用函式自身的方法。

遞迴演算法是一種直接或者間接地呼叫自身演算法的過程。在計算機編寫程式中,遞迴演算法對解決一大類問題是十分有效的,它往往使演算法的描述簡潔而且易於理解。

遞迴演算法解決問題的特點:

(1) 遞迴就是在過程或函式裡呼叫自身。

(2) 在使用遞迴策略時,必須有乙個明確的遞迴結束條件,稱為遞迴出口。

(3) 遞迴演算法解題通常顯得很簡潔,但遞迴演算法解題的執行效率較低。所以一般不提倡用遞迴演算法設計程式。

(4) 在遞迴呼叫的過程當中系統為每一層的返回點、區域性量等開闢了棧來儲存。遞迴次數過多容易造成棧溢位等。所以一般不提倡用遞迴演算法設計程式。在實際程式設計中尤其要注意程式設計客棧棧溢位問題。

借助遞迴方法,我們可以把乙個相對複雜的問題轉化為乙個與原問題相似的規模較小的問題來求解,遞迴方法只需少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少了程式的**量。但在帶來便捷的同時,也會有一些缺點,也即:通常用遞迴方法的執行效率不高。

提到遞迴,我們可能會想到的乙個例項便是斐波那契數列。斐波那契數列就是如下的數列:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, …,總之,就是第n(n > 2)個數等於第(n - 1)個數和(n - 2)個數的和。用遞迴演算法實現如下:

public static int fibonacci(int n)

還有就是求乙個數的階乘,也會用到遞迴,這個比較簡單,直接給出實現**,如圖:

漢諾塔是根據乙個傳說形成的數學問題:

漢諾塔示意圖(來自網路)

有三根桿子a,b,c。a桿上有n個(n>1)穿孔圓盤,盤的尺寸由下到上依次變小。要求按下列規則將所有圓盤移至c杆:

1、每次只能移動乙個圓盤;

2、**不能疊在小盤上面。

提示:可將圓盤臨時置於b杆,也可將從a杆移出的圓盤重新移回a杆,但都必須遵循上述兩條規則。

問:如何移?最少要移動多少次?

下面是漢諾塔的遞迴求解實現(c#**):

public static void hannoi(int n, string from, string buffer, string to)程式設計客棧

else

}其執行結果如圖(大家可以跟上面的gif對比一下):

對於乙個長度為n的串或者n個字元(數字、節點)組成的字串陣列,它的全排列共有a(n,n)=n!種。這個問題也是乙個遞迴的問題。如1,2,3,全排列可得到:。

用遞迴演算法實現**如下:

public static void permutation(string nums, int m, int n)

}else

console.writeline();}}

呼叫**如下:

static void main(string args)

;permutation(nums, 0, nums.length);

console.readkey();

}這裡傳入乙個string陣列,abc三個字母來測試,輸出如下圖:

有時候,我們需要將全排列的結果儲存,然後做其他的處理,我們可以將結果儲存到乙個鍊錶中。我們定義如下類作為鍊錶的節點,**如下:

public class node

public node nextnode

public node(string value)

}此時宣告全域性變數,如下:

public static list nodelist = new list();

這個時候,我們修改permutation方法,如下:

public static void permutation(string nums, int m, int n)

}else

nodelist.add(root);}}

這樣,我們執行了permutation方法後,就將結果儲存到鍊錶中了。用的時候,我們只要遍歷nodelist就可以了。如程式設計客棧圖:

遞迴演算法就先說到這裡了,希望能夠給你帶來幫助,也希望您能夠多多****的更多內容!

本文標題: c#實現遞迴演算法經典例項

本文位址: /ruanjian/csharp/454231.html

遞迴演算法經典例項 演算法 遞迴演算法

遞迴現象 老和尚講故事 自己呼叫自己 兩面鏡子互相映像 兩者相互呼叫 演算法思想 把規模大的問題轉化為規模小的相似的子問題來解決。在函式實現時,因為解決大問題的方法和解決小問題的方法往往是同乙個方法,所以就產生了函式自己呼叫自己的情況。遞迴函式 內部操作直接或間接地呼叫了自己的函式。遞迴函式兩大要素...

php遞迴演算法經典例項

遞迴函式為自呼叫函式,在函式體內直接或間接自己呼叫自己,但需要設定自呼叫的條件,若滿足條件,則呼叫函式本身,若不滿足則終止本函式的自呼叫,然後把目前流程的主控權交回給上一層函式來執行,可能這樣給大家講解,還是很難明白,直接上例子 function test n else echo n.test 2 ...

遞迴和分治演算法 經典題目

made by syx 2010年7月13日 21 05 27 迴圈賽日程表 快速排序 合併排序 棋盤覆蓋 有bug 求大數乘積 10進製,但有丟位 二分搜尋技術 整數劃分 階乘 迴圈賽日程表 include include using namespace std const int n 100 i...