我在Pascal中有一个关于接收器检测的实现。这是代码:
FUNCTION KATAVOTHRA (A:MATRIX; N:INTEGER): INTEGER;
VAR
I,J,K,S:INTEGER;
BEGIN
KATAVOTHRA:=0;
I:=1;
WHILE (KATAVOTHRA=0 AND I<N) DO {1}
BEGIN
J:=1;
WHILE (A[I,J]=0 AND J<N) DO J:=J+1; {2}
IF (J=N) THEN BEGIN
S:=0;
FOR K:=1 TO N DO S:=S+A[K,I];
IF (S=N-1) THEN
KATAVOTHRA:=1;
END;
I:=I+1;
END;
END;
假设我们有以下邻接矩阵:
0 0 1
1 0 1
0 0 0
代表V1
,V2
和V3
个顶点。 (如果我们在两个节点之间有连接,则为1个代码,否则为零代码。)
我试图用这个输入来跟踪代码,但我不能。原因是当我3岁时我没有得到结果。让我们看看到目前为止我做了什么:(KATAVOTHRA
是接收器的名称)。
BEGIN with I:=1; and J:=1
(在第一个while循环中)
首先我们检查A[1,1]
如果为零,那么(当然是1 <3,以便继续)所以J= J+1 => J=2
A[1,2]
也为零,所以再次递增J,现在J为3. 3不小于3且A[1,3]
不为0.所以我们要转到IF语句IF( J = N) => IF( 3 = 3 ) then S=0 (sum)
所以我们要进入FOR循环并总结A[1,1] + A[2,1] + A[3,1]
IF( S = N-1) THEN
我们找到了一个接收器。但是这里S=1
没有2.我们走出FOR循环,我现在将再次成为2 WHILE(KATAVOTHRA=0 AND 2<3)
J是1我们现在检查A[2,1]
但不是零而2不是3所以我们出去......我现在将成为3 ......但是这次3&lt; 3是假的,所以整个循环终止于那里?我无法理解(尽管我对Pascal lagnuage没有多少经验。)
这有什么问题?
答案 0 :(得分:1)
我现在将是3 ....但这次3&lt; 3是假的,所以整个循环终止于那里?
正如您已经注意到的那样,您的循环过早结束了一个数字。
为避免这种情况,您必须测试I <= N
。
这是一个显示两种变体的简短程序:
PROGRAM LoopTest;
VAR
i : Integer;
BEGIN
WriteLn("Example with <");
i := 0;
WHILE (i < 3) DO
BEGIN
WriteLn(" Loopvar: ", i);
i := i + 1;
END;
WriteLn;
WriteLn("Example with <=");
i := 1;
WHILE (i <= 3) DO
BEGIN
WriteLn(" Loopvar: ", i);
i := i + 1;
END;
END.
输出:
Example with < Loopvar: 0 Loopvar: 1 Loopvar: 2 Example with <= Loopvar: 1 Loopvar: 2 Loopvar: 3
现在很容易看到:
<
用于基于零的数组<=
用于一个基础数组