1. 程式人生 > >C#每日一練 (5.25)

C#每日一練 (5.25)

練習1:一列數的規則如下: 1、1、2、3、5、8、13、21、34......求第30位數是多少, 用遞迴演算法實現。
        /// <summary>
        /// 求滿足{1,1,2,3,5,8,13,21,34}此規律的第n位數的值
        /// </summary>
        /// <param name="a1">數列的第一個數</param>
        /// <param name="a2">數列的第二個數</param>
        /// <param name="i">遞迴計數,固定值為 1 </param>
        /// <param name="n">需求的第n位數</param>
        private static void FindNum(int a1, int a2, int i, int n)
        {
            try
            {
                //列印從第三位數開始,到第n位結束的所有值
                //Console.WriteLine(a1 + a2);

                //對遞迴計數,試圖除以0時退出遞迴
                i++;
                int temp = 1 / (n - 1 - i);
                //得到第三個數的值
                int a3 = a1 + a2;
                //將a2和a3作為形參遞迴 
                FindNum(a2, a3, i, n);
            }
            catch (DivideByZeroException e)
            {
                //只打印第n位的值
                Console.WriteLine(a1 + a2);
            }
        }
練習1寫完程式碼感覺並不是很好,於是百度找了下答案,可見自己對遞迴理解不夠。(如下)
private static int Find(int i)
        {
            if (i <= 0)
                return 0;
            else if (i > 0 && i <= 2)
                return 1;
            else return Find(i - 1) + Find(i - 2);
        }

練習2:有一個3*4矩陣,輸出最大元素的值,及其所在的行號和列號, int a[3][4]={{1,2,3,4},{9,8,7,6}, {-10,10,-5,2}}。
namespace Practice_5._25
{
    class Program
    {
        static void Main(string[] args)
        {
            #region 練習2 
            int[,] a = { { 1, 2, 3, 4 }, { 9, 8, 7, 6 }, { -10, 10, -5, 2 } };
            int max = a[0, 0]; //將二維陣列的第0行0列設為最大值
            int maxRow = 0; //記錄最大值所在的行數
            int maxColumn = 0; //記錄最大值所在的列數
            for (int i = 0; i < a.GetLength(0); i++)
            {
                for (int j = 0; j < a.GetLength(1); j++)
                {
                    if (max < a[i, j])
                    {
                        max = a[i, j];
                        maxRow = i;
                        maxColumn = j;
                    }
                }
            }
            Console.WriteLine("最大值為:{0},行數為:{1},列數為:{2}", max, maxRow + 1, maxColumn + 1);
            #endregion
            
            Console.ReadKey();
        }
}
練習3:實現二分法查詢,int a[8] = {3,12,24,36,55,68,75,88},查詢24需要幾次查找出來。
        /// <summary>
        /// 二分法查詢陣列的值
        /// </summary>
        /// <param name="array">有序陣列</param>
        /// <param name="value">需查詢的值</param>
        /// <returns>返回找到的下標,未找到返回-1</returns>
        private static int DichotomySearch(int[] array, int value)
        {
            int mix = 0; //陣列最小值下標
            int max = array.Length - 1; //陣列最大值下標
            int i = 0; //查詢次數計數
            while (mix < max)
            {
                int mid = (max + mix) / 2; //陣列中間值下標
                if (value == array[mid])
                {
                    i++;
                    //輸出查詢次數
                    Console.WriteLine("查詢次數為:" + i);
                    return mid; //找到返回陣列的下標
                }
                else if (value < array[mid])
                {
                    //查詢值比中間值小,縮小查詢區間為[array[mix],arrary[mid]]
                    max = mid;
                    i++;
                }
                else
                {
                    //查詢值比中間值大,縮小查詢區間為[arrary[mid],arrary[max]]
                    mix = mid;
                    i++;
                }
            }
            //沒找到返回 -1
            return -1;
        }
練習4:實現氣泡排序, int[] array = { 23,45,16,7,42 }。
        /// <summary>
        /// 實現一個數組的升序排列
        /// </summary>
        /// <param name="arrary">需排序的陣列</param>
        private static void Sort(int[] arrary)
        {
            for (int i = 0; i < arrary.Length - 1; i++)
            {
                for (int j = 0; j < arrary.Length - 1 - i; j++)
                {
                    //升序排列
                    if (arrary[j] > arrary[j + 1])
                    {
                        arrary[j] = arrary[j] + arrary[j + 1];
                        arrary[j + 1] = arrary[j] - arrary[j + 1];
                        arrary[j] = arrary[j] - arrary[j + 1];
                    }
                }
            }
            for (int k = 0; k < arrary.Length; k++)
            {
                Console.Write(arrary[k] + " ");
            }
        }
練習題目來源網路。