摘要:即興寫作~ 列出所有組合數(遞迴式)
半夜不睡覺很傷身,是為了什麼呢? 當然是為了看Lin呀~ 也不負眾望
拿下 28分 20投11中 三分 6投3中 14助攻 5抄截 7失誤 雖然失誤有點多 但是被對方守成這樣 也算合格了
邊看球賽的時候邊在想PTT版上某個版友問的組合遞回式問題 (所以我還是有在想程式哦 ㄎㄎ)
然後想到了把他畫成樹的樣子就比較好解決了
題目是:有 N 堆(依使用者輸入),每一堆裡面放不同種類的東西 (種類數不定值),然後要列出所有的組合。
程式如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
namespace ConsoleTest
{
///
/// 組合遞迴程式
///
/// 把堆數當成樹的分層;每一堆的種類數當作樹的節點
///
class Program
{
static ArrayList[] total; //二維陣列 total[堆數][每堆的種類數]
static int tlevel = 0; //總堆數
static string tmp = ""; //串接字串
static int index = 0; //目前組合數
static void Main(string[] args)
{
int num = Console.Read(); //輸入堆數要幾堆
num = num - 48; //讀進來是ASCII 的10進位,所以扣掉48為輸入的值
total = new ArrayList[num];
for (int i = 0; i < total.Length; i++) //記得做陣列一定要初始化,讓每列都有參考到物件
{
total[i] = new ArrayList();
}
//手動新增測試----
total[0].Add("A");
total[0].Add("B");
total[0].Add("C");
total[1].Add("D");
total[1].Add("Z");
total[2].Add("E");
total[2].Add("F");
total[3].Add("G");
total[3].Add("K");
//-----
tlevel = total.Length; //總堆數等同於總層級數
//以第一堆為切入點開始進入遞迴式
for (int i = 0; i < total[0].Count; i++)
{
tmp = total[0][i].ToString();
Fruit(1, total[1].Count);
}
Console.ReadKey();
}
///
/// 串接遞回式
///
///
目前所在的那一堆
///
目前所在的那一堆,所含有的種類數
public static void Fruit (int level, int kind)
{
if (level < tlevel-1) //該層還有下層
{
for (int i = 0; i < kind; i++) //該層有幾個節點,每個節點往下層延伸
{
string t = tmp;
tmp+=total[level][i].ToString();
Fruit(level + 1, total[level + 1].Count);
tmp = t;
}
}
else// 到最末節點的時候
{
for (int i = 0; i < kind; i++)
{
index++;
Console.WriteLine(tmp+total[level][i].ToString()+"------------------("+index.ToString()+")");
}
}
}
}
}
這只是個雛型,可以依照需求去做變化調整~