即興寫作~ 列出所有組合數(遞迴式)

摘要:即興寫作~ 列出所有組合數(遞迴式)

半夜不睡覺很傷身,是為了什麼呢? 當然是為了看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()+")");
                }
            }
        }
    }
}

 

這只是個雛型,可以依照需求去做變化調整~