遞歸函數的練習,漢諾塔問題的程序實現(遞歸)


1.漢諾塔是由三根桿子A,B,C組成的。A桿上有N個(N>1)穿孔圓盤,盤的尺寸由下到上依次變小。要求按下列規則將所有圓盤移至C桿:每次只能移動一個圓盤;大盤不能疊在小盤上面。提示:可將圓盤臨時置於B桿,也可將從A桿移出的圓盤重新移回A桿,但都必須尊循上述兩條規則。問:如何移?最少要移動多少次?漢諾塔是根據一個傳說形成的一個問題:

有三根桿子A,B,C。A桿上有N個(N>1)穿孔圓盤,盤的尺寸由下到上依次變小。要求按下列規則將所有圓盤移至C桿:

每次只能移動一個圓盤;

大盤不能疊在小盤上面。

提示:可將圓盤臨時置於B桿,也可將從A桿移出的圓盤重新移回A桿,但都必須尊循上述兩條規則。

問:如何移?最少要移動多少次?

 1 class Program
 2     {
 3         static int i = 1;
 4         static void move(int n, char from, char to) //將編號為n的盤子由from移動到to  
 5         {
 6             Console.WriteLine("第{0}步:將{1}號盤子{2}---->{3}\n", i++, n, from, to);
 7         }
 8         static void hanoi(int n, char from, char denpend_on, char to)//將n個盤子由初始塔移動到目標塔(利用借用塔)  
 9         {
10             if (n == 1)
11                 move(1, from, to);//只有一個盤子是直接將初塔上的盤子移動到目的地  
12             else
13             {
14                 hanoi(n - 1, from, to, denpend_on);//先將初始塔的前n-1個盤子借助目的塔移動到借用塔上  
15                 move(n, from, to);              //將剩下的一個盤子移動到目的塔上  
16                 hanoi(n - 1, denpend_on, from, to);//最后將借用塔上的n-1個盤子移動到目的塔上  
17             }
18         }
19         static void Main(string[] args)
20         {
21             Console.Write("請輸入盤子的個數:\n");
22             int n;
23             n = Convert.ToInt32(Console.ReadLine());
24             char x = 'A', y = 'B', z = 'C';
25             Console.Write("盤子移動情況如下:\n");
26             hanoi(n, x, y, z);
27 
28             
29         }

運行結果舉例:

2.猴子吃桃的問題

 1 static void Main(string[] args)
 2         {
 3             int a=Taozi(1);
 4             Console.WriteLine(a);
 5             
 6         }
 7         static int Taozi(int day)
 8         {
 9             if (day == 7)
10             {
11                 return 1;
12             }
13             int n = (Taozi(day + 1) + 1) * 2;
14             return n;
15         
16         }

3.做夢

 1  static void Main(string[] args)
 2         {
 3             //遞歸函數
 4             //做夢
 5             Test(1);
 6             Console.WriteLine();
 7         }
 8         static void Test(int n)
 9         {
10             if (n>10)
11             {
12                 return;
13             }
14             Console.WriteLine("這是第{0}次在做夢",n);
15             Test(n+1);
16             Console.WriteLine("第{0}次夢醒了",n);
17         }

運行結果:

4.折紙問題:

 static void Main5(string[] args)
        { 
        //折紙
            double houdu = 0.00008;
             Zhezhi(houdu);
            Console.WriteLine(n);
        }
        
        static void Zhezhi(double h)
        {
            
            if (h>8848)
            {
                return ;
            }

               Zhezhi(h*2);
                 n++;
                      
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM