C++ 再說泛化

2023-03-20 15:54 更新

另舉一個泛化的例子:想象一下,你需要一個可以打印任意長度的乘法表,而不僅僅是6×6的表。你可以為printMultTable添加一個參數:

void printMultTable (int high) {
    int i = 1;
    while (i <= high) {
        printMultiples (i);
        i = i + 1;
    }
}

我用參數high替代6。如果我用參數值7調用printMultTable,我將得到輸出:

1 2 3 4 5 6
2 4 6 8 10 12
3 6 9 12 15 18
4 8 12 16 20 24
5 10 15 20 25 30
6 12 18 24 30 36
7 14 21 28 35 42

一切很好,除了一點:我可能想讓這個表變?yōu)榉疥嚕ㄐ袛岛土袛狄粯樱_@意味著我需要為printMultiples添加另一個參數來指定表的列數。

絮叨幾句,我也把這個參數命名為high,說明了不同函數可以有相同名字的參數(如同局部變量):

void printMultiples (int n, int high) {
    int i = 1;
    while (i <= high) {
        cout << n*i << " ";
        i = i + 1;
    }
    cout << endl;
}

void printMultTable (int high) {
    int i = 1;
    while (i <= high) {
        printMultiples (i, high);
        i = i + 1;
    }
}

注意,當我添加一個新的參數,我必須改變函數的第一行(即接口或原型),同時必須修改printMultTable中調用函數的地方。正如所料,這段程序生成了一個7×7的方陣:

1 2 3 4 5 6 7
2 4 6 8 10 12 14
3 6 9 12 15 18 21
4 8 12 16 20 24 28
5 10 15 20 25 30 35
6 12 18 24 30 36 42
7 14 21 28 35 42 49

當你適當的泛化一個函數以后,你常常會發(fā)現程序的輸出結果有一些意外的性質。比如,你可能注意到了,乘法表示對稱的,因為ab=ba,所以表中所有的項都出現了兩次。你可以只打印半張表以省墨。將

printMultiples (i, high);

改為

printMultiples (i, i);

你將得到輸出:

1
2 4
3 6 9
4 8 12 16
5 10 15 20 25
6 12 18 24 30 36
7 14 21 28 35 42 49

至于其工作原理,就留給你分析了。

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號