實驗 遞迴演算法設計與應用
一. 基本原理的概括
遞迴是一種重要的程式設計方法。使用遞迴方法有時可使演算法簡潔明瞭,邏輯清晰,易於設計。
遞迴指演算法自己呼叫自己, 有直接遞迴與間接遞迴兩種。
遞迴方法用於解決一類滿足遞迴關係的問題。即:對原問題的求解可轉化為對其性質相同的子問題的求解。
二. 該類演算法設計與實現的要點
1. 遞迴關係:產生遞迴的基礎。
當演算法中某步驟要通過解性質相同的子問題實現時,該步驟用遞迴呼叫實現。找準遞迴關係是解此類問題的關鍵。
2. 遞迴出口(結束條件):確定遞迴的層數。
當子問題的規模充分小時可直接求解時,遞迴結束。乙個遞迴關係必須有遞迴出口才能正常結束。
3. 引數設定:引數表示了原問題及其不同的子問題。
引數表示了子問題的大小和狀態,以區別原問題以及不同層次的子問題。
4. 演算法功能的設定:嚴格規定遞迴演算法要解決什麼樣的問題。
演算法功能的正確設定是保證遞迴過程正確進行的前提。
三. 實驗目的和要求
1. 加深對遞迴演算法的理解,掌握遞迴演算法的設計方法;
2. 針對具體應用問題,設計解決問題的演算法;
3. 分析演算法的複雜性,尋找比較高效的演算法,並實現。
四. 實驗內容
格雷碼問題
1.問題描述
對於給定的正整數n,格雷碼為滿足如下條件的乙個編碼序列:
(1) 序列由2n個編碼組成,每個編碼都是長度為n的二進位制位串。
(2) 序列中無相同的編碼。
(3) 序列中位置相鄰的兩個編碼恰有一位不同。
例如:n=2時的格雷碼為:。
設計求格雷碼的遞迴演算法並實現。
2. 具體要求
輸入的第一行是乙個正整數m,表示測試例個數。接下來幾行是m個測試例的資料,每個測試例的輸入資料由一行組成,用乙個正整數n (n<=20),表示格雷碼的位數。
輸出:對於每個測試例輸出2n行,表示2n個長度為n的格雷碼。第一行為最長遞增子串行的長度,第二行為最長遞增子串行,整數之間用乙個空格隔開。兩個測試例的輸出資料之間用乙個空行隔開。
3. 測試資料
如, 輸入:
4 輸出:
0 0 0 0
0 0 0 1
0 0 1 1
0 0 1 0
0 1 1 0
0 1 1 1
0 1 0 1
0 1 0 0
1 1 0 0
1 1 0 1
1 1 1 1
1 1 1 0
1 0 1 0
1 0 1 1
1 0 0 1
1 0 0 0
4. 設計與實現的提示
對於同乙個輸入的正整數,不同的演算法得到的格雷碼可能會不同。長度為n的格雷碼可以由長度為n-1的格雷碼適當變換而成。可以用陣列或字串來儲存格雷碼。對於較大的正整數n,用陣列儲存容易引起宕機。
五、實驗步驟
觀察格雷碼的結構,我們會有以下發現:
1、除了最高位(左邊第一位),格雷碼的位元完全上下對稱(看下面列表)。比如第乙個格雷碼與最後乙個格雷碼對稱(除了第一位),第二個格雷碼與倒數第二個對稱,以此類推。
2、所以,在實現的時候,可以利用遞迴,在每一層前面加上0或者1,然後就可以列出所有的格雷碼。
如果要生成4位元格雷碼,我們只需要在3位元格雷碼上再加一層0,1就可以了: 0000,0001,0011,0010,0110,0111,0101,0100,1100,1101,1111,1110,1010,0111,1001,1000.
也就是說,n位元格雷碼是基於n-1位元格雷碼產生的。
根據以上分析編寫遞迴演算法
實驗**:
public
class test2
}public
static string graycode(int n)
//上一位元的格雷碼
string last = graycode(n - 1);
//在上一位元的基礎上加一層0,1
for (int i = 0; i < last.length; i++)
return graycode;
} }
自動生成格雷碼演算法
典型的二進位制格雷碼 binary gray code 簡稱格雷碼,在一組數的編碼中,若任意兩個相鄰的 只有一位二進位制數不同,則稱這種編碼為 格雷碼 gray code 另外由於最大數與最小數之間也僅一位數不同,即 首尾相連 因此又稱 迴圈碼或 反射碼。自動生成格雷碼的演算法主要利用以下規則 1....
生成格雷碼
程式設計題 生成格雷碼 在一組數的編碼中,若任意兩個相鄰的 只有一位二進位制數不同,則稱這種編碼為格雷碼 gray code 請編寫乙個函式,使用遞迴的方法生成n位的格雷碼。給定乙個整數n,請返回n位的格雷碼,順序為從0開始。測試樣例 1返回 0 1 思想 用遞迴法實現,把求n位格雷碼分解為求n 1...
生成格雷碼
題目描述 在一組數的編碼中,若任意兩個相鄰的 只有一位二進位制數不同,則稱這種編碼為格雷碼 gray code 請編寫乙個函式,使用遞迴的方法生成n位的格雷碼。給定乙個整數n,請返回n位的格雷碼,順序為從0開始。測試樣例 1返回 0 1 1 n 1時,返回0,1 2 n 2時,返回00,01,10,...