我看了一个介绍分形和杨辉三角的视频,其中提到了杨辉三角中数字的奇偶性,联想到奇偶性和布尔运算有密切联系,于是写了点代码来展示杨辉三角中数字的奇偶性。
杨辉三角中的每个数字 都等于它左上角的数字 和右上角数字 的和(如果一个数字左上角没有数字或者右上角没有数字,那么这个数字的值为 )。如果我们只关注数字的奇偶性,那么可以这样分析 ⬇️ (下表的分析仅针对 和 都存在的情况)
| 是否为奇数 | 是否为奇数 | 是否为奇数 |
|---|---|---|
| ❌ | ❌ | ❌ |
| ❌ | ✅ | ✅ |
| ✅ | ❌ | ✅ |
| ✅ | ✅ | ❌ |
至于边界值(即左上角没有数字或者右上角没有数字的那些数字)的处理,我们可以在数组中多存放 个元素。如果杨辉三角中某一行有 个数字,那么我们就用有 个元素的 数组来保存各个数字的奇偶性(这样判定下一行各个数字的奇偶性时,会很好处理)。在此基础上,可以写出这样的代码 ⬇️
public class Analyzer {
public void displayRow(boolean[] isOddNum, int n) {
for (int i = 1; i <= n; i++) {
System.out.print(isOddNum[i] ? '*' : ' ');
}
System.out.println();
}
public void analyze(int bound) {
int n = 1;
// isOddNum[0] and isOddNum[len - 1] are always false
boolean[] isOddNum = new boolean[]{false, true, false};
while (true) {
displayRow(isOddNum, n);
if (++n == bound) {
break;
}
isOddNum = calcNextRow(isOddNum, n);
}
}
private boolean[] calcNextRow(boolean[] isOddNum, int n) {
boolean[] nextRowResult = new boolean[n + 2];
for (int i = 1; i <= n; i++) {
nextRowResult[i] = isOddNum[i - 1] != isOddNum[i];
}
return nextRowResult;
}
public static void main(String[] args) {
new Analyzer().analyze(80);
}
}
请将以上代码保存为 Analyzer.java。运行如下命令就可以编译 Analyzer.java。
javac Analyzer.java
运行如下命令可以运行 Analyzer 中的 main 方法。
java Analyzer
在我电脑上的运行结果如下 ⬇️ (* 表示这个位置的数字是奇数,空格表示这个位置的数字是偶数)
*
**
* *
****
* *
** **
* * * *
********
* *
** **
* * * *
**** ****
* * * *
** ** ** **
* * * * * * * *
****************
* *
** **
* * * *
**** ****
* * * *
** ** ** **
* * * * * * * *
******** ********
* * * *
** ** ** **
* * * * * * * *
**** **** **** ****
* * * * * * * *
** ** ** ** ** ** ** **
* * * * * * * * * * * * * * * *
********************************
* *
** **
* * * *
**** ****
* * * *
** ** ** **
* * * * * * * *
******** ********
* * * *
** ** ** **
* * * * * * * *
**** **** **** ****
* * * * * * * *
** ** ** ** ** ** ** **
* * * * * * * * * * * * * * * *
**************** ****************
* * * *
** ** ** **
* * * * * * * *
**** **** **** ****
* * * * * * * *
** ** ** ** ** ** ** **
* * * * * * * * * * * * * * * *
******** ******** ******** ********
* * * * * * * *
** ** ** ** ** ** ** **
* * * * * * * * * * * * * * * *
**** **** **** **** **** **** **** ****
* * * * * * * * * * * * * * * *
** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
****************************************************************
* *
** **
* * * *
**** ****
* * * *
** ** ** **
* * * * * * * *
******** ********
* * * *
** ** ** **
* * * * * * * *
**** **** **** ****
* * * * * * * *
** ** ** ** ** ** ** **
* * * * * * * * * * * * * * * *