基於給定條件生成所有可能的 N 長度母音排列


在本問題中,我們正在研究利用母音建立 N 長度排列。排列指的是元素的有序排列。本文重點關注母音字母 A、E、I、O 和 U。目標是找到這些母音的所有長度為 N 的組合。每個排列中,母音必須佔據 N 個位置,並且允許重複。例如,如果 N 為 3,則考慮排列 AAA、AAE、AIA、AOU 等。任務要求計算並列出所有這些針對指定 N 的單個排列。

使用的方法

  • 遞迴

  • 迭代方法

遞迴

在 N 長度母音排列的上下文中,遞迴涉及一個自引用過程來生成所有可能的配置。程式從空排列開始,透過在每個位置新增一個母音(A、E、I、O、U)來迭代地探索每個位置。一旦達到所需的長度 N,它就會透過分支到較小的子問題來繼續此過程。它透過回溯並探索所有可能性來確保考慮所有可能的包含重複的排列。由於遞迴在較高的 N 值下可能會因重複計算而導致效率降低,因此在靈活性和效能之間取得平衡至關重要。

演算法

  • 建立一個函式來建立排列,該函式接收當前排列、其當前長度以及所需的長度 N。

  • 檢查函式中的當前長度是否等於 N。如果是,則在返回之前列印最新的排列。

  • 如果當前長度小於 N,則迭代所有母音(A、E、I、O、U)。

  • 將每個母音新增到當前排列中,然後遞迴呼叫該函式並遞增長度。

  • 在遞迴呼叫後,從當前排列中刪除新增的母音以考慮其他情況(回溯)。

  • 對每個母音重複步驟 3 到 5,探索所有組合,直到達到 N 長度排列。

  • 使用空排列呼叫排列函式。

示例

#include <iostream>
using namespace std;

void generatePermutations(string current, int currentLength, int n) {
   if (currentLength == n) {
      cout << current << endl;
      return;
   }

   string vowels = "AEIOU";
   for (char vowel : vowels) {
      generatePermutations(current + vowel, currentLength + 1, n);
   }
}

int main() {
   int n = 3; 
   generatePermutations("", 0, n);
   return 0;
}

輸出

AAA
AAE
AAI
AAO
AAU
AEA
AEE
AEI
AEO
AEU
AIA
AIE
AII
AIO
AIU
AOA
AOE
AOI
AOO
AOU
AUA
AUE
AUI
AUO
AUU
EAA
EAE
EAI
EAO
EAU
EEA
EEE
EEI
EEO
EEU
EIA
EIE
EII
EIO
EIU
EOA
EOE
EOI
EOO
EOU
EUA
EUE
EUI
EUO
EUU
IAA
IAE
IAI
IAO
IAU
IEA
IEE
IEI
IEO
IEU
IIA
IIE
III
IIO
IIU
IOA
IOE
IOI
IOO
IOU
IUA
IUE
IUI
IUO
IUU
OAA
OAE
OAI
OAO
OAU
OEA
OEE
OEI
OEO
OEU
OIA
OIE
OII
OIO
OIU
OOA
OOE
OOI
OOO
OOU
OUA
OUE
OUI
OUO
OUU
UAA
UAE
UAI
UAO
UAU
UEA
UEE
UEI
UEO
UEU
UIA
UIE
UII
UIO
UIU
UOA
UOE
UOI
UOO
UOU
UUA
UUE
UUI
UUO
UUU

迭代方法

迭代方法使用巢狀迴圈來系統地建立組合,以找到所有可能的 N 長度母音排列。從空排列開始,我們一次填充一個槽位,每個槽位都填充每個母音(A、E、I、O 和 U)。透過分層 N 個迴圈來檢查所有可能的組合,我們有效地生成了所需的排列。此方法提供了一種實用方法來列出所有唯一的排列,而無需使用遞迴或複雜的資料結構。它易於構建,並且在 N 值較小的情況下效果良好。

演算法

  • 將 N(即排列的預期長度)設定為一個值。

  • 建立一個列表或陣列來儲存排列。

  • 建立 N 個指標(索引)並將每個指標初始化為 0,對應於排列中的一個位置。

  • 建立一個迴圈,該迴圈持續到每個指標都到達最後一個母音索引(U)為止。

  • 在迴圈內構建當前排列,方法是連線索引指向的母音。

  • 將生成的排列儲存在陣列或列表中。

  • 增加最右邊的指標並檢查是否已超出母音陣列的長度。

  • 如果超出最大索引,則將指標重置為 0 並增加其右側的指標。

  • 重複步驟 5 到 8,直到生成所有排列。

  • 現在,陣列或列表包含每個不同的 N 長度

示例

#include <iostream>
#include <string>
using namespace std;

void generatePermutations(string vowels, int N, string& permutation, int 
index) {
   if (index == N) {
      cout << permutation << endl;
      return;
   }

   for (int i = 0; i < 5; ++i) {
      permutation[index] = vowels[i];
      generatePermutations(vowels, N, permutation, index + 1);
   }
}

int main() {
   int N = 3;   string vowels = "AEIOU";
   string permutation(N, 'A');
   generatePermutations(vowels, N, permutation, 0);

   return 0;
}

輸出

AAA
AAE
AAI
AAO
AAU
AEA
AEE
AEI
AEO
AEU
AIA
AIE
AII
AIO
AIU
AOA
AOE
AOI
AOO
AOU
AUA
AUE
AUI
AUO
AUU
EAA
EAE
EAI
EAO
EAU
EEA
EEE
EEI
EEO
EEU
EIA
EIE
EII
EIO
EIU
EOA
EOE
EOI
EOO
EOU
EUA
EUE
EUI
EUO
EUU
IAA
IAE
IAI
IAO
IAU
IEA
IEE
IEI
IEO
IEU
IIA
IIE
III
IIO
IIU
IOA
IOE
IOI
IOO
IOU
IUA
IUE
IUI
IUO
IUU
OAA
OAE
OAI
OAO
OAU
OEA
OEE
OEI
OEO
OEU
OIA
OIE
OII
OIO
OIU
OOA
OOE
OOI
OOO
OOU
OUA
OUE
OUI
OUO
OUU
UAA
UAE
UAI
UAO
UAU
UEA
UEE
UEI
UEO
UEU
UIA
UIE
UII
UIO
UIU
UOA
UOE
UOI
UOO
UOU
UUA
UUE
UUI
UUO
UUU

結論

使用遞迴和迭代方法,對 N 長度母音排列的檢查提供了對建立所有可能的長度為 N 的母音組合的有用見解。遞迴方法使用自引用機制系統地探索每個位置,有效地收集所有可能的包含重複的排列。但是,由於冗餘計算,其效率在較大的 N 值下可能會下降。然而,對於適度的 N 值,迭代方法透過使用巢狀迴圈生成所需的排列而無需使用遞迴,提供了一種實用且有效的解決方案。在選擇最佳方法時,必須考慮當前挑戰的具體要求和複雜性。

更新於: 2023年8月4日

219 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.