加载中...

6.10 再说泛化


另举一个泛化的例子:想象一下,你需要一个可以打印任意长度的乘法表,而不仅仅是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

一切很好,除了一点:我可能想让这个表变为方阵(行数和列数一样)。这意味着我需要为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

当你适当的泛化一个函数以后,你常常会发现程序的输出结果有一些意外的性质。比如,你可能注意到了,乘法表示对称的,因为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

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


还没有评论.