打印杨辉三角

杨辉三角

问题描述

打印下图所示的杨辉三角:

设计思路

杨辉三角的特点:

  1. 第i行有i个数,且每行的第一个数和最后一个数都是1;

  2. 每行除了第一个数和最后一个数,其余各数都是其两肩上的数之和。

如果将所有的数存在一个二维数组a[n][n]中,则有: a[i][1] = a[i][i] = 1(i = 1, 2, 3, ……,n) a[i][j] = a[i - 1][j - 1] + a[i - 1][j](i = 3, 4, 5, ……,n;j = 2, 3, ……,i - 1)

为了打印输出左右对称的等腰数字三角形,可以设置二重循环,其中,外层循环设置循环变量i 控制打印所有行,每行打印30 - 2 * i个前导空格;内层循环设置循环变量j控制打印第i行的所有数。

Swift 3.0 代码实现

func printYanghuiTriangle(n: Int) {
    var a = [[Int]](repeating: [Int](repeating: 0, count: n + 1), count: n + 1)
    
    for i in 1...n {
        a[i][1] = 1
        a[i][i] = 1
    }
    
    for i in 3...n {
        for j in 2...(i-1) {
            a[i][j] = a[i - 1][j - 1] + a[i - 1][j]
        }
    }
    
    for i in 1...n {
        for _ in 1...(30 - 2 * i) {
            print(" ", terminator:"")
        }
        for j in 1...i {
            print(a[i][j], " ", terminator:"")
        }
        
        print("")
    }
}

printYanghuiTriangle(n: 9)

算法理解

for i in 3...n {
    for j in 2...(i-1) {
        a[i][j] = a[i - 1][j - 1] + a[i - 1][j]
        // 不是 a[i][j] = a[i - 1][j - 1] + a[i - 1][j + 1]
        // 因为被空格隔开了,所以,计算时,上一行的后一个数不是j+1列,而是第j列
    }
}