使用佇列實現楊輝三角

FunnyOne發表於2017-10-17

使用佇列實現楊輝三角

使用佇列實現楊輝三角

楊輝三角的特點:

  • 除了第一行,其他行兩端都為1;
  • 從第三行開始可以看出,除了兩端,其中每個數都是元素本身上面對著的兩個數的和;
  • 奇數行有奇數個數,偶數行有偶數個數,都是n個數
  • 每行數從左端開始看到中間都是升序,都是正序。

想要用程式碼來實現楊輝三角最簡單的方法就是使用兩個陣列來實現,互相承載結果,並將陣列列印出來。但結合楊輝三角的特點,正序可以想到用佇列的問題來解決。

解決方案:

可以想到,作為開端的1可以看成是0和1的和,因此開始可以將佇列設成這樣(此處是以3行為例子)

使用佇列實現楊輝三角

設定變數a和b來作為佇列第一個元素和第二個元素的載體。在a獲取了第一個元素後將第一個元素移出佇列,然後讓b獲取新的第一個元素,然後將a和b加起來,並將結果移進佇列中,並將結果列印出來

使用佇列實現楊輝三角

然後重複上述步驟,可以得到:

使用佇列實現楊輝三角

要能夠獲取第二行的值,我在第一行中進行兩次和運算即可,第一輪到此也就可以停止了。

然後,讓一個0入列,再次重複上面的步驟,具體流程大概是這樣:

使用佇列實現楊輝三角

遇到的問題:

最初的原始碼:

package ch15;

import java.util.Scanner;

/**
 * Created by Funny_One on 2017/10/13.
 */
public class YangHuiTriangle {
    public static void main(String[] args) {
        CircularArrayQueue<Integer> queue = new CircularArrayQueue();
        Scanner sca = new Scanner(System.in);

        System.out.println("需要顯示的行數:");
        int n = sca.nextInt();

        queue.enqueue(0);
        queue.enqueue(1);
        System.out.println(1);
        for(int times =0;times<n;times++){
        queue.enqueue(0);
        for(int i=1;i<queue.size()-1;i++){
            int a,b=0,c;
            if(queue.size()==1){
                a = b;
                b = queue.first();
                c = a + b;
                queue.enqueue(c);
                System.out.print(c);
            }else {
                a=queue.first();
                queue.dequeue();
                b = queue.first();
                queue.dequeue();
                c = a+b;
                queue.enqueue(c);
                System.out.print(c+" ");
            }

        }
            System.out.println();
        }
    }
}

執行的結果是:
使用佇列實現楊輝三角

可以見到,其中出現的問題有:

  • 問題1:每一行只有一個元素;
  • 問題2:每個元素都是1;
  • 問題3: 不只有三行;

在我進行除錯之後,發現這些問題的原因是:

問題1的原因:在我的程式碼中,當a和b將資料獲取之後,一個1入列,1被列印出來,同時兩個數被移出佇列。此時的queue.size()= 2而i從1也變成2了,所以該迴圈結束,下面的也是如此的情況,因此一行就只有一個元素

問題2的原因:在第一輪之後,佇列中只有兩個數:0和1,因此做和運算後便只有列印1出來。

問題3的原因:因為最初先加了一行1,後面的關於times的迴圈有三次,因此會有四行出現。

修改後:

 for(int times =0;times<n;times++){
        queue.enqueue(0);
        int viceTimes = queue.size()-1;
            for(int m =n-times; m>=0;m--){
                System.out.print(" ");
            }
        for(int i=1;i<=viceTimes;i++){
            int a,b=0,c;

                a=queue.first();
                queue.dequeue();
                b = queue.first();

                c = a+b;
                queue.enqueue(c);

                System.out.print(c+" ");
        }
            System.out.println();
        }

用一個變數viceTimes來承載進行和運算的次數,並且該值固定不變。這樣就能解決問題了。

相關文章