タスクは本当に複雑に見えるので、実際には簡単です。最初は難しく見えるかもしれません。結果に導くルートではなく、最終結果を考えているからです。
コーディングの古いルールを使用できるように変更するには、分割統治. このアプローチは、複雑な問題の類似点を見つけて、主な問題を実行可能な単純なタスクに減らすことを教えてくれます。言い換えれば、私たちは大きな問題をいくつかの小さな問題に分割します。これは非常に簡単に解決でき、最後に小さな結果を大きな問題に結合します。
だからあなたの問題から始めないでください。
Q1: 数字のピラミッドを印刷するには?
それがわからないので、他のことに焦点を当てましょう。
観察を改善するために、背景の詳細を追加できます
1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7
0 _ _ _ _ _ _ _ _ 9 _ _ _ _ _ _ _ _
1 _ _ _ _ _ _ _ 8 9 8 _ _ _ _ _ _ _
2 _ _ _ _ _ _ 7 8 9 8 7 _ _ _ _ _ _
3 _ _ _ _ _ 6 7 8 9 8 7 6 _ _ _ _ _
4 _ _ _ _ 5 6 7 8 9 8 7 6 5 _ _ _ _
5 _ _ _ 4 5 6 7 8 9 8 7 6 5 4 _ _ _
6 _ _ 3 4 5 6 7 8 9 8 7 6 5 4 3 _ _
7 _ 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 _
8 1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 1
今こそ観察の時です。
その観察から、次のアイデアを思いつくことができます。
アイデア: ピラミッドは 2 つの三角形の構成です。
結論: そのピラミッドの半分を書く方が簡単です。それでは、酸っぱい問題を言い換えましょう。
Q2: 三角に見える連番の書き方は?
これは本当に簡単です。最初のループが列を担当し、行を担当するために必要なのは 2 つのループだけです。
for (int column = 1; column <= 9; column++) {
for (int row = 1; row <= 9; row++) {
// Observe what will happen if
// we use == or <= or > or <>
if (column ## row) {
System.out.print(row);
} else {
System.out.print(" ");
}
}
System.out.println(' ');
}
最初のタスクを完了すると、画面に正方形、三角形、数字の行を印刷できるようになります。
したがって、次のような三角形を印刷する方法がわかっている場合:
r
c 1 2 3 4 5 6 7 8 9
1 _ _ _ _ _ _ _ _ 9
2 _ _ _ _ _ _ _ 8 9
3 _ _ _ _ _ _ 7 8 9
4 _ _ _ _ _ 6 7 8 9
5 _ _ _ _ 5 6 7 8 9
6 _ _ _ 4 5 6 7 8 9
7 _ _ 3 4 5 6 7 8 9
8 _ 2 3 4 5 6 7 8 9
9 1 2 3 4 5 6 7 8 9
通常、コンピューターの世界での操作は 1 つではなくゼロから始まります。
r
c 0 1 2 3 4 5 6 7 8
0 _ _ _ _ _ _ _ _ 9
1 _ _ _ _ _ _ _ 8 9
2 _ _ _ _ _ _ 7 8 9
3 _ _ _ _ _ 6 7 8 9
4 _ _ _ _ 5 6 7 8 9
5 _ _ _ 4 5 6 7 8 9
6 _ _ 3 4 5 6 7 8 9
7 _ 2 3 4 5 6 7 8 9
8 1 2 3 4 5 6 7 8 9
あなたがそれで成功したら、私たちはちょっと立ち止まって考えます。
行ごとにこれらすべての操作を繰り返さなければならないのはなぜですか? 値をどこかに置くことができれば、それらを考えて計算する必要はなくなり、結果全体を画面に書き込むことだけに集中できます。
この問題の解決策は、配列と動的計画法として知られるアプローチの概念です。このアプローチでは、将来の操作に使用されることをどこかに記憶しようとします。
したがって、ワームアップとして、それらを印刷する代わりに、配列に番号を割り当てるだけにしましょう。
[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [9]
[ ] [ ] [ ] [ ] [ ] [ ] [ ] [8] [9]
[ ] [ ] [ ] [ ] [ ] [ ] [7] [8] [9]
[ ] [ ] [ ] [ ] [ ] [6] [7] [8] [9]
[ ] [ ] [ ] [ ] [5] [6] [7] [8] [9]
[ ] [ ] [ ] [4] [5] [6] [7] [8] [9]
[ ] [ ] [3] [4] [5] [6] [7] [8] [9]
[ ] [2] [3] [4] [5] [6] [7] [8] [9]
[1] [2] [3] [4] [5] [6] [7] [8] [9]
で、次のようなコードを考え出す必要があります
int[] array = new int[9];
for (int column = array.length; column > 0; column--) {
for (int row = 0; row <= array.length; row++) {
if (column == row) {
array[row - 1] = column;
}
}
System.out.println(Arrays.toString(array));
}
そのコードから明らかなことは、各ステップで 1 つの値のみを設定するということです。それを以下に示します
9 [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [9] - Step one we put nine
8 [ ] [ ] [ ] [ ] [ ] [ ] [ ] [8] [ ] - Step two we put eight
7 [ ] [ ] [ ] [ ] [ ] [ ] [7] [ ] [ ]
6 [ ] [ ] [ ] [ ] [ ] [6] [ ] [ ] [ ]
5 [ ] [ ] [ ] [ ] [5] [ ] [ ] [ ] [ ]
4 [ ] [ ] [ ] [4] [ ] [ ] [ ] [ ] [ ]
3 [ ] [ ] [3] [ ] [ ] [ ] [ ] [ ] [ ]
2 [ ] [2] [ ] [ ] [ ] [ ] [ ] [ ] [ ]
1 [1] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]
9 つの手順の後、配列全体に数値を入力します。
まだ欠けているのは、画面上の結果です。そのためには、各ステップで配列全体を出力する必要があります。最初に左から右に印刷し、その後フロントエンドから先頭に印刷する必要があります。
そして、魔法を行うコードは次のようになります
public static void pyramide(int levels) {
int[] tab = new int[levels];
for (int row = tab.length; row > 0; row--) {
tab[row - 1] = row;
//Print left
for (int i = 0; i < tab.length; i++) {
if (tab[i] != 0) {
System.out.print(tab[i]);
} else {
System.out.print(' ');
}
}
//Print right
for (int i = tab.length - 2; i >= row - 1; i--) {
if (tab[i] != 0) {
System.out.print(tab[i]);
}
}
System.out.println("");
}
}