使用隊列實現楊輝三角


使用隊列實現楊輝三角

楊輝三角的特點:

  • 除了第一行,其他行兩端都為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來承載進行和運算的次數,並且該值固定不變。這樣就能解決問題了。


免責聲明!

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



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