一切看起来都很简单,但有些事情并没有想到一个正常的解决方案。基本代码:
M = 5
KTR(2 * M, 2 * M)
FOR i = 1 TO M - 1: FOR j = i + 1 TO M: KTR(i, j) = 1
蟒蛇代码:
M = 5
KTR = [[None] * (2 * M), [None] * (2 * M)]
z = 1
z1 = z + 1
for i in range(M - 1):
for i1 in range(M):
KTR[0][z] = 1
KTR[1][z1] = 1
z = z + 1
z1 = z1 + 1
但是,总是有越界调用。告诉我我做错了什么。这不是学校或大学的问题,我希望将程序重新制作成另一种语言。
BASIC代码直译
FOR i = 1 TO M - 1
创建一个循环,遍历从 1 到M-1
inclusive的所有值。在 Python 中,这可以写成
for i in range(1, m)
. 请注意,它不包括右边框,因此两个循环绕过range()
相同的值。EW Dijkstra 解释了(在 1982 年)为什么不应包括右边界。i
KTR(2 * M, 2 * M)
声明一个KTR
包含2*M+1
行和2*M+1
列的表(如果这个构造像1964 BASIC 手册DIM A(17)
中描述的那样工作)。在 Python 中,不声明变量。相反,一个对象(例如,一个列表)使用分配符号分配一个名称(在示例中):
ktr
尽管 BASIC 允许从零开始索引,但习惯上像
A(1)
BASIC 一样引用列表中的第一个元素,而不是A[0]
Python。手册明确说A(7)
这是第七个元素,而不是索引从零开始的语言中习惯的第八个元素(A[7]
这是 Python 中的第八个元素)。对此,将BASIC代码直译成Python:
可能无法反映编写 BASIC 代码的程序员的实际意图。
实现BASIC 代码的 [可能]意图
如果打算创建一个
m
对角线为零的上三角矩阵:在这里它像
True == 1
在False == 0
Python 中一样使用。或使用
numpy.triu()
:ktr
[程序员的] BASIC代码的另一个[可能]意图的实现
要创建
2m x 2m
一个用零初始化的矩阵并用一个填充对角线上方的上三角四分之一:假设在您的情况下,BASIC 索引来自一个,而 for-to 循环包括两个边界。
要清楚,这里是相同的,使用numpy 数组:
ktr
在 BASIC 中,数组是二维的 10x10,在 Python 中是 2x10。当然不行。
Python 中的整个循环很容易描述:
结果:
出于某种原因,指定了数组的边界
2*M
,并且枚举仅达到M
- 很可能这是防止超出数组限制的保险:那些用 BASIC 编写的人喜欢这样写。然而,这很容易修复。我们将边界扩展到
2*M
并同时将索引移动 1,因为在 Basic 中第一个数组索引是 1,而不是 0:结果:
现在,就像在 BASIC 中一样。
好吧,一个简单(但无聊)的翻译,因为它是用 Python 从原始 BASIC 翻译过来的: