首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C语言名题精选百则——其他有关问题

2012-11-16 
C语言名题精选百则——其他问题?第7章其他问题问题 7_ 1 Buffon 丢計问题(BUFFON.C )在地面上画出距离为L的

C语言名题精选百则——其他问题

?

第7章其他问题

问题 7_ 1 Buffon 丢計问题(BUFFON.C )

在地面上画出距离为L的平行线,有一根长度为D的针。如果把针随意地往地面上一 丢,请问压线的概率有多少?这就是有名的Buffon (人名)丢针(Needle)问题。请写一 个程序,用仿真的技巧,估计出针压线的概率。

【说明】

如图7-1所示,把针的一端视为一个参考点,讨论就以这个点为中心。当把针丢在地 上时,这个参考点距离下方平行线有x长,与下方平行线成0角。

图7-1

?

于是针的另一端与下方平行线的距离就是:

?

x + LsinG

如,这个值在0与D之间,亦即:

?

S0<x+Lsin?i<D

:#%针就没有压线,不然针就是压线的。

?

?因为针是随意丢的,x与0可能是0?D与0?2tc之间的任何一个数。于是可以产生 两个随机数,第一个在0?D之间,另一个在0?2n之间,分别表示x与8。如果一共产 生了 n个位置,而发现0个是没有压线的,那么压线的概率就大概是1-c/n。在理论上,这 个问题的答案是:

在写程序时不妨假定L与D都是1,看看得到的概率是否近似于2/JC,亦即近似于0.64。

?

阔题7.2三色旗闼题(FLAGC )

假设有一个数组,它有n个元素,每一个不外乎是红、白、蓝3种颜色之一的代号,

就说是R、W、B好了。这些元素在数组中并没有依同样颜色的元素排在一起的方式来排 列,请写一个程序把这些元素排成所有蓝色在前,然后是白色,最后是红色的排列方式, 不过在写程序时要满足下面的条件:
(1)不能用到额外的内存,换句话说,只能在数组之内用互换的方式完成。
(2)互换两个元素的动作要越少越好。
(3)对于每一个元素而言,测试它是红、白,还是蓝的工作,每种颜色最多只能做一 次测试。
在这个限制之下,请编写一个最快的程序。
【说明】
有些人很自然地会想到把蓝色当成1、白色当成2、红色当成3,然后用排大小的程序 把次序排出来,自然地蓝色在前,白色居中,红色最后了;完全正确,不过却违背了规定。 也就是说,互换两个元素的动作是不是太多了呢?对每一个元素测试它的颜色的行为是否 违反了要求呢?对前者而言,不同的排序方法会有不同数目的互换动作。比如说,如果用 选择法,每次找到i+1?n中最小的值,与第i个元素互换,那么排序的动作只不过用了 n-1 次互换。但是对第三个限制而言,就很难保证对每一个元素、每一种颜色都最多只测试一 次了。
第三个条件需要仔细地说明,x[i]表示第i个元素。第三个条件是说,x[i]== R, x[i]==W, x[i]==B这3个比较的任何一个都最多只能做一次。举个例子,如果在决定x[i]应该放在什 么地方时,上述3个比较都各做一次,是正确的。任取两个或任取一个各做一次,也是正 确的。但x[i]==R、x[i]==W、x[i]==R就是错的了,因为对R的测试做了两次。
其实这个题目并不难,把数组从头到尾查一次就可以做出结果,那3个繁琐的条件, 只不过是防止去用排序或“不够快”的方法来解题而己。问题7.3字符串列轚数的转换(X一ATOI.C )在平常课本中的atoi()函数范例,通常都不能查出溢位(Overflow)的情况,或者是米 理会这个情况而给出错误的结果,请修改这个atoi()程序,把转换后的结果用第二个参数返 回来。例如,x_atoi(s,*t)就用t返回结果,而函数则指出OVERFLOW (大于最大整数值), UNDERFLOW (小于最小整数值),NCLERROR (正常),为了方便起见,假设使用的机器 是用2的补码来储存整数。有没有办法查出机器是用1的补码还是2的补码?
【说明】
atoi()函数的函数值是没办法检验是否正确的,除非把它用itoaO转换回字符串,再与原 字符串比较数字符号部分是否相等。程序在得到不正确的atoi()函数值之后还可以毫无其事 地工作,除非最终结果相当“奇怪”,否则很可能就会当成正确的结果,并且接收它。正因 为如此,使用atoi()就会有潜在的危险。所以,这个题目就是要加强atoi()的功能。例如,可以写一个x_atoi(s,*t)函数,接收一 个字符串s,把转换结果存放在t中返回来,同时,再利用函数值来指出OVERFLOW、 UNDERFLOW、NO_ERROR。请问,要如何修改atoi()这个函数呢?
问覉7.4整数类型列的祓值(LIMITS.C )请写一个程序,求出在<limits.h>这个引入文件中所定义的、各个有关整数类型的特 征值。
【说明】
或许使用的系统中的<limitS.h>有更多的信息,但在这个题目中主要的对象是整数类 型:char、short、int与long、signed或unsigned。要想办法,通过自己的程序找出每一个 整数类型各占用多少个数元。有符号(signed)时的极大值、极小值,无符号(unsigned) 时的极大值(极小值永远是0)。不要用sizeof,它是以char为基准的,而char占多少个数 元呢?另外,在特定的情况下——也就是说只写了 char,char类型是有符号还是无符号的 呢?知道机器是用1的补码还是2的补码吗?
为了方便起见,不必把程序写得具有100%的移植性,不妨假设符号数元在最左边,而 不是采用符号数元与其他位数分离的方式。
在程序中,不能引入<limits.h>,并且把值显示出来,也不能用sizeof,换句话说,只 能靠C语言的基本功能来做这件事。另外更重要的是,不要假设在用IBM PC、Mac、VAX 或任何用习惯了的机器;事实上在编写这个程序时不能以任何机器做假设换言之,移植 性固然不能做到100%,但总是越高越好,所以不妨想到溢位时程序可能会停执行,而失 掉计算结果这件事上头;这一点很重要,一些机器有此功能,所以要小心。
问题7.5无眼位数箕术(ARITH.C )请写一个使用十进制算术,并且可以计算任意位数精确度的正整数加法与乘法的程序。 【说明】
计算机中所存的值都只能有有限的精确度,例如long通常有9?10位,double则大约 有15位等,一旦计算结果越出了这个范围,值就不再是正确的了。然而在许多研究中,比 如计算机代数学(Computer Algebra)、几何论证(Geometric Reasoning)等,都不能有不精 确的值产生,因为产生了不精确(或近似)的值,整个推论过程甚至于结果就都不复成立。 所以,计算机科学家就开发出不少这一类型具有无限精确度的软件,比如MACSYMA、 Scratchpad II> Reduce、MATHEMATICA 等都是有名的例子。
在无限精确度的加、减法中,程序本身要提供没有误差的整数运算,而究竟有多少精确度则常常由硬件或内存决定;因此,要做两个1_位的十进制数相乘,结果差不多会有 2_位,一般而言并不是一件难事。
在这个题目中,要编写两个进行无限精确度算术的函数,一个是加法,一个是乘法;. 加法是简单的,在写乘法的程序时,千万不要直接使用手算的方式先把每个位数都乘出来, 最后用加法去加,这样会使乘法函数相当没有效率,应该想想如何避免这一点。闼题1.6线牲表示的矩砗相乘(MATMUL_C )在C语言中虽然号称功能比Pascal、Fortran强,但是在某些方面其实却并不见得有多 少改进,函数参数中的高维数组轉是一个例子,如果要保持数组的结构,那么就只能在第 一维留下空白而变成不完整数组,其他维度的容量还是得写出来。这一点只比Pascal好一 点点,而与Fortran、PL/1或Ada相比还差得远。在早期Fortran程序员为了突破Fortran的 限制而开发出一组很实用的技巧,本题与问题7.7的目的就在于此。请写3个函数,第一 个函数把二维数组转换成一维,第二个函数把一维转换成二维,第三个函数求两个代表二 维数组的一维数组运行矩阵相乘。
【说明】
要写的第一个函数不妨叫做:
void twoD_to_oneD(int TwoD[ ] [MAXSIZE], int m, int n, int OneD[]);
它接收一个二维数组TwoD[][](不知道有多少列,但内存中有MAXSIZE行),目前 己经有了m列n行数据,再把这个数组以列为主的次序存入一个一维数组中,因此工作做 完之后,OneD门中有m*n个元素,前n个是TwoD[][]的第一列,其次的n个为第二列 等。注意,TwoD[][]与OneD[][]可能在同一个位置。
第二个函数是:
void oneD一to」woD(int OneD[ ],int TwoD[ ] [MAXSIZE], int m, int n);
它把一维数组OneD门还原成原来的二维数组。注意,OneD[]与T\voD[][]可能在同一 个位置。
第三个函数为:
void matmul (int a[ ]’ int b[ ]’ int c[ ],int L,int M,int N);
a[]、b[]都是一个二维数组转换成一维数组的形式,各有L列M行、M列N行,请把 a[]与b[]的乘积求出存入c[ ] (L列N行)。闼题7.7对称表示的矩砗相乘(MATMULJS.C )问题7.6的矩阵是一般形式的,但若是个对称矩阵,转换成线性形式就可以省下差不
?66 _多一半的内存位置,这就不止是方便的问题了。对一个n列n行的对称矩阵(它一定是方 阵)而言,如果用二维数组方式储存,就需要mTi个元素,但是因为是对称的缘故,储存 上半(或下半)三角形的部分就足够了,所以就只需要n(n+l)/2个位置而已。请对照上一 题,写出StwoDJ;o__oneD()、oneD_to—StwoD()以及Smatmul()这3个函数,但对象全都是对 称矩阵。
【说明】
因为对称矩阵一定是方阵,所以上一题的3个函数中的矩阵的列、行数目的参数就可 以合二为一,如下所示:
void StwoD_to_oneD(int TwoD[ ] [MAXSIZE], int n, int OneD[]); void oneD_to__StwoD(int OneDf ], int TwoD[ ][MAXSIZE], int n); void Smatmul (int a[ ],int b[ ],int c[ ],int n);
前两个函数与问题7.6是相似的,但第三个函数SmatmulO就要小心些,因为在一维的 对称矩阵中,有一半的元素并没有储存起来,而是靠另一半(因为对称的关系)记录下来 的,因此在相乘时,除了第一列与最后一行之外,其他的列与行都不完全,要如何把它补 完全呢?问题7.8找霉钱问题(CHANGE.C )
某个国家一共发行了 ai,a2,a3,…,ak种不同面额的钞票,为了方便起见,假设 ai<a2<…<ak。现在手上有n,请问要如何把n兑换成apa2,a3,…,丨1£这些鈔票,使得所
用钞票的量为最少。
【说明】
先说一个最常见的例子,如果有1元、5元、10元3种,而又有107元要兑换,于是= 1, a2=5, a3=10, n = 107。兑换方式很简单,用面额最大的去除,那就是最大面额钞票的 张数,比如说n/a3 =107/10 = 10,亦即10元的10张;除过之后就会有余数7,再用次大面
额的钞票去除,得商数1 (7/5=1),余数2,所以5元的一张;再把余数用第三大面额去除
(2/1)得商数2,余数0,于是1元的两张,但余数为0,于是就没有剩下来的钱了,因此
最后结果是10元10张,5元1张,1元两张。假若n = 78,那就是10元7张,5元1张,
1元3张,一般书中就是这样讲的,不过对1元、5元、10元这个例子而言,倒也是正确。
如果钞票的面额是1元、3元、4元(奇怪的数字,是吧?),要兑换10元呢?用上面
的方法,有4元两张(10/4=2,余2)、1元两张,一共用了 4张钞票。但若用两张3元、1
张4元,也兑出了 10元,却只用了 3张钞票。
这个例子说明,寻常所用的方法固然可以兑换钞票,但钞票张数却不是最少的;此外 问题是,请写一个程序,输入ai,a2…,ak*票面额,以及II个欲兑换的钱数,输出钞票张
数最少的兑换方式。问题7.9背包问题(KNAPSACK.C)
如果有n个对象,它们的计量单位各为kpk2,…,kn;现在有一个可以容纳K单位的M卷y..背包,请写一个程序,找出有没有办法在1,2,…,n中选p个元素出来,使得计量单位的总 和为K,可以刚好把背包装满。这就是有名的背包问题(Knapsack Problem )。
【说明】
就以计量单位分别是1,2,4,7,10,12,13,15,17这9个对象来看好了,若背包的容量是27 单位,可以取4,10与13,因此4+10+13=27;但也可以取2,12,13,因此27=2+12+13;更可 以取10与17,于是27=10+17;当然还有其他的可能解答。不过,这个题目却是不一定有 解的。例如,若对象的计量单位是1,5,10,15,20;而背包是14,物件中比14小的有1,5,10, 无论如何选择,都不可能加出一个14来的。
就像上一题找零钱的问题一样,可以用动态规划的技巧来解这个问题,不过会复杂一 些,但基本道理是完全相同的。
问题7.10最诖矩砗相乘顺序(PRODSEQ.C )
已知一连串的矩阵,…4“,要计算它们的连乘积'xAj…xAn_1;请写一 个程序,读入各个矩阵的维度的容量,找出一个使乘法数目为最少的计算方式。
【说明】
一个m列n行的矩阵与另一个n列k行的矩阵相乘,如果使用传统的方式,一共要使
用nrnk个乘法,原因是将第i列(II个元素)与第j列(也有n个元素)两两相乘时一共要
n个乘法,n-1个加法;但是因为相乘的结果是一个m列k行的矩阵,上述的行为就要重 复做mk次,因此就一共有mnk个乘法,mk(n-l)个加法。而加法比乘法快许多,所以一
般都只计算乘法的个数。
在求3个矩阵4丨,C的连乘时,数学公式可以写成Cd ?(??(:),换言之, 先乘前两个与先乘后两个的结果是一样的,但在程序工作时效率却可能不尽相同。如果 4及C分别是a列b行、b歹lie行、c列d行的矩阵,那么A .J?要abc个乘法,结果是个a
列c行的矩阵;再把这个结果与C这个c列d行矩阵相乘,这要acd个乘法,所以求(A ?!?) -C 就需要&1)0 + &0(1 = &<:(1) + (!)个乘法。先乘遇就要用bed个乘法,得出一个b列d行的矩
阵,然后与它相乘,要abd个乘法,所以A ? (5 ? C)就要用bcd+abd=bdOH~c)个乘法。
一般而言,ac(b + d) *bd(a + c),所以就得选择值比较少的那一个方式。举个例子,如果
a=5、b=2、c=3、d=4,于是 ac(b + d) = 90 ,而 bd(a + c) = 64,于是 4 ? (B ? C)的乘法个
数比较少,效率比(Ad).C的高;反之,如果a=4、b=3、c=2、d=5, ac(b + d) = 64,但bd(a + c) = 90,于是G4*fi)*C就比较快。因此,当一连串矩阵连乘时,选择一个合
适的计算顺序往往可以使程序的效率提高很多。就以上例来看,快的方法只不过用了慢的 方法的71%左右的时间而已。
如果输入的是一连串数组的维度容量,比如说d。,^,…,dn, ‘与屯是第0个矩阵的
列数与行数,屯与句是第一个矩阵的列数与行数,…,士与di+1是第i个矩阵的列数与行 数,最后,第n-1个矩阵的列数与行数是dy与dn。有办法找出使乘法数目最低的计算方
式吗?
问题7.11最短路径问题(SHORTEST.C )
如果有一个矩阵/其中& >o表示i地到j地的距离。若i与j之间无路可通, ^就是无穷大(~);又\=0。请写一个程序,通过这个距离矩阵,把任意两个城市之间
的最短距离与其行经路径找出来。
【说明】
有4个城市如图7-2所示,彼此之间有路相通的都用箭头标了出来,在旁边的就是那 一条路的距离;例如,1到2的距离是5, 2到1却是50。很明显地从1到4的最短距离是 10,沿途经过1—2—4,而不是走2—3—4,因为距离是35。图7-2解法仍然是用动态规划。可以这样想,对于任何一对城市i与j而言,查每一个其他的 顶点k,看看i—…一k,再加上k—…一j的距离是否比目前i—j的距离还少,如果是,就 把i—j的距离改成中途经过k的距离。要如何找出i到k的行经路径呢?
在输入距离矩阵时建议釆用下面的形式:3
4 44
1
315
15
500 0 输入 SHORTEST,INl在此,第一列是指出有多少个城市(4);第二列以后各有3个数;第一与第二个是某条 路的起点与终点,第三个数则是那一条路的距离,最后用3个0作结束。上面的数据正好 对应着前面的图,城市的编号是1?n(城市总数),不从0开始是避免与最后1列的3个0 有任何冲突。
所以,最好写3个函数,第一个读入数据,第二个算出最短路径,第三个把路径显示出来。 为了方便,如图7-3所示对应着另一个输入文件SHORTEST.IN2。可以执行程序,看o63^^7X 6X\/ 7 ^
43图7-3看结果,确认己经了解了问题2问题7.12产生匹配括号的字符串(PAR一GEN.C )请写一个程序,输入一个正整数的值,然后列出所有由n个左括号与n个右括号正确 地组成的字符串;当然,正确的左、右括号一定个数一样多,所以输入的值要是个偶数。
【说明】
所谓由括号正确地组成的字符串,指的是如果有一个左括号,那么在它的右边就一定 有一个与它相匹配的右括号。例如,00、(0),就是仅有的两个有4个符号的,由括号正 确地组成的字符串;000、()(())、(())()、((()))则是4个有6个符号,由括号正确地组成的 字符串。正因为有一个左(或右)括号就一定有相对应的右(或左)括号,左、右括号成 双出现,因此输入就一定要是偶数,奇数是不可能的。当输入n之后,在字符串中左、右 括号的个数就各是n/2个。
如何产生这样的字符串呢?下面就是一个有用的想法:如果在工作过程中己经产生了 若干左、右括号,为了要把产生的行为完成,还欠R个左括号、L个右括号,那么有没有办法找出产生下一个括号时L与R的关系呢?记住,递归是一个不容忽视的利器。问题7.13葙定伴侶问题(STABLE.C )
有n个男孩*",mn与n个女孩wpw2,…,wn。每一个男孩都依照他喜爱
这n个女孩的程度列成一张表,最喜欢的女孩排在第1位,最不喜爱的女孩排在第n位; 同样地,每一个女孩也依照她喜爱n个男孩的程度列成一张表。请写一个程序,把每一
个男孩与女孩的喜爱表格读入,并且把男孩与女孩一一配对,使得:如果1^与%()在一对 的话,那么第一,对!!^的喜爱表格中排在wq之前的女孩而言,她的伴侣在她的表格中一 定排在mp之前;第二,对wq的喜爱表格中排在mp之前的男孩而言,他的伴侣在他的表 格中一定排在wq之前。这就是稳定伴侣(Stable \fairiage)问?。
【说明】
这个问题恐怕要多说一些才能讲得明白d先讲不稳定(Unstable)的情况;如果m的 女伴记成PM(m),而w的男伴写成1\^~)。如果有一对男孩与女孩m与w,他们不是伴侣
(用上面的记号,m的伴侣是PM(m) ,w的伴侣是1^(\^)),但m比较中意w而不是1^(111), 则同时w比较中意m而不的时候,m与w就一定心不甘情不愿了。例如,如果A
与B是男孩,X与Y是女孩,A比较中意X,B比较中意Y, A与Y、B与X结伴,那么A 与Y心目中的情人都不是对方,B与X亦然,这就是不稳定的状况。稳定伴侣的问题,就是 要在喜爱的表格中配出最合适、稳定的伴侣,而不是“乔太守乱点鸳鸯谱”制造对对怨偶。 看一个完整的例子。假设男孩与女孩都用编号1,2,3,4,其喜爱表格如表7-1所示。表7-1男 孩女 孩1:24 ?131:21432:31422:43123:23143:14324:41324:2143
表格中指出,男孩1最中意的女孩是2,其次是4与1,最后是3;对于女孩3而言,她 最中意1,其次是4与3,最后是2,对于这两份喜欢表格而言,稳定伴侣是如表7-2所示。’
*表7-2男 孩女孩142A ?33241 ?1第1号男孩与第4号女孩配对,他们是不是怨偶?在第1号男孩喜欢表格中,排在第 4号女孩之前的是第2号;再看第4号女孩,在她的喜爱表格中排在1之前的是第2号男 孩,于是都符合了稳定的条件。用同样的方法可以查证其他的3对伴侣。
在编写程序时,可以用男孩为主,对女孩求婚,而由女孩由她的喜爱表格来决定接受 还是不接受;如果可以接受,就不妨先接受,等到有更中意的男孩求婚了,就中止上一个 约定(不是现实世界,不必太拘泥),另结新欢。数据证明,一定可以找出稳定伴侣的结 果的。
在常见的问题中,计算机择友就是一个类似的问题,但要求却比较松些,因为男女双 方不必列出对“所有”对象的喜爱程度,而且也有可能出现喜爱程度相同的情形,当然解 题的方法就复杂了。
? j 问题7.14单调矩砗的祓埴(MONO_MAX.C )在*这个题目中讲一个所谓的单调(Monotone)矩阵的概念。如果一个矩阵中的第i列 上的极大值所在的那一行记为ij; i<j时,ijSkj,也就是在上方的列的极大值会座落在
下方的列的极大值的左边,满足这个条件的矩阵就叫做一个单调矩阵。请写一个程序,接 收一个单调矩阵,找出这个单调矩阵中每一列的极大值。请估计一下程序用了多少次比较。
【说明】‘
这是个简单、有趣,但是却有其他用途的题目,看一个例子来澄清问题的本意,在下 面的5X5矩阵中:第1、2、3、4、5列的极大值分别在第1、2、2、3、5行,因此上一列的极大值都在 本列极太值的左上方,这正是条件。题目就在于找出每一列上的极大值,使程序输出 3,3,3,5,6。注意,只知道矩阵满足单调的条件,但却不知道极大值在何处,后者正是程序的 任务。要写出程序并不难,固定列的号码,在那一列上找极大值就行了,程序要比较m*n 次,m与a是矩阵的列数与行数,而程序却没有发挥“单调”这一特性。聪明一些的程序 员马上会想到这一点,从最下方一列开始做,找出极大值之后把它在那一行记住,就说在 第q行好了,然后在处理上一列时,就在第1?q个元素中找极大值即可。这是个不错的想 法,但还是不够好,因为还是做了差不多与n2成正比的比较次数(比如说极大值都在对角 线),能突破这一点吗?问题7.15向霣分类(CLASSIFY.C )
已知一组元素Xi,X2,…,Xm,其中每一个都是有n个量的向量,亦即Xi =[xil,xi2,… ,xb], n是个固定值。因为这些量,乂^并不一定是数值,所以比较大小有时不见得有意义,
只能假设对它们作比较相等或不相等的动作。编写一个程序,定出合理的数据结构,处理 这些XPX2,…,Xra,把它们相同的归在一类;乂,与乂』相同,就指的是Xil=Xjl,
xi2=xj2,…,Xin =Xjn。在写程序时,不妨假定Xij已经被编码成整数,但不能比大小。
【说明】
这是一个在实用中常见的题目,只不过换成一个容易了解的说明。一般而言,Xij不一
定是一个值,而可能是一个函数,当把i与j有关的数据代入该函数时,就会得到一个分类 用的值(亦即此处的xy),但这个值却没有任何次序或大小的关系,所以用排大小的方式
就完全没有意义了。
另外一点,在应用中也不能像排序时一样,通过移动元素而把相同的向量归在同一类, 因此这些想法都使编程者有了如下的限制:
(1)向量中元素之间只能有相等或不等,而不能比大小。
(2)不能移动这些向量,因为它们很可能并不是一个值。
因此,有没有办法把这些向量分类呢?下面是几点可能有用的提示:
(1)为了方便起见,不妨把向量,…,xj想象成一个m列n行矩阵中的
第i列,所以Xij就正好是第i列第j行中的值;若不是一个值也无妨,可以把它想象成一
个指向函数的指针。
(2)因为不能移动各列,所以只好移动指向各列的指针。
(3)因为值没有大小的关系,所以排大小的技巧派不上用场,得另想它法。
(4)分类结果一般都遵守这样的规定:…,xj与Y = [yu,yi2,…,yin]是
两个向量,若那么在输入中有某个在Y之前的向量,它的第1个分量是xu时,
X就排在Y前面;若xi2=yi2,…,那么但是xu+1#yu+1,匆果在输
入中有某个向量的前j个分量与X以及Y的相同,而且第j+1个分量是Xi,^,不但如此,
该向量是出现在Y之前,那么X就在Y的前面。例如,若输入是:
X = [1,2,3]
Y = [2,3,4]
Z = [1,2,4]
那么输出是:x = [1,2,3]
Y = [1,2,4]
Z = [2,3,4]
对于Z与Y而言,因为在Y之前有一个向量(X)的第一个分量与Z的第一个分量相 同,所以Z就排到前面去。
这些条件看来复杂,但事实上却都是很自然的,因为在分类时有点像字符串顺序。在 写程?序时,不妨先不理会最后一点,等到程序正确无误之后再作进一步的尝试。注意,不 要排出顺序,而是列出哪一个向量在哪一类,因此对上面的数据而言,X,Y,Z分别在第1、 3、2 类。

热点排行