RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 593656
Accepted
Ivan Stasiuk
Ivan Stasiuk
Asked:2020-11-21 07:51:07 +0000 UTC2020-11-21 07:51:07 +0000 UTC 2020-11-21 07:51:07 +0000 UTC

将 BASIC Loop 转换为 Python

  • 772

一切看起来都很简单,但有些事情并没有想到一个正常的解决方案。基本代码:

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

但是,总是有越界调用。告诉我我做错了什么。这不是学校或大学的问题,我希望将程序重新制作成另一种语言。

python-3.x
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    jfs
    2020-11-21T10:30:18Z2020-11-21T10:30:18Z

    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

    ktr = [[None] * (2 * m + 1) for _ in range(2 * m + 1)]
    

    尽管 BASIC 允许从零开始索引,但习惯上像A(1)BASIC 一样引用列表中的第一个元素,而不是A[0]Python。手册明确说A(7)这是第七个元素,而不是索引从零开始的语言中习惯的第八个元素(A[7]这是 Python 中的第八个元素)。

    对此,将BASIC代码直译成Python:

    m = 5
    ktr = [[None] * (2 * m + 1) for _ in range(2 * m + 1)]
    for i in range(1, m):
        for j in range(i + 1, m + 1):
            ktr[i][j] = 1
    

    可能无法反映编写 BASIC 代码的程序员的实际意图。

    实现BASIC 代码的 [可能]意图

    如果打算创建一个m对角线为零的上三角矩阵:

    m = 5
    ktr = [[int(i < j) for j in range(m)] for i in range(m)]
    

    在这里它像True == 1在False == 0Python 中一样使用。

    或使用numpy.triu():

    import numpy as np
    
    m = 5
    ktr = np.triu(np.ones((m, m), dtype=int), 1)
    

    ktr

    [[0 1 1 1 1]
     [0 0 1 1 1]
     [0 0 0 1 1]
     [0 0 0 0 1]
     [0 0 0 0 0]]
    

    [程序员的] BASIC代码的另一个[可能]意图的实现

    要创建2m x 2m一个用零初始化的矩阵并用一个填充对角线上方的上三角四分之一:

    m = 5
    ktr = [[0] * (2 * m) for _ in range(2 * m)]
    for i, row in enumerate(ktr[:m - 1]):
        row[i + 1:m] = [1] * (m - i - 1)
    

    假设在您的情况下,BASIC 索引来自一个,而 for-to 循环包括两个边界。

    要清楚,这里是相同的,使用numpy 数组:

    import numpy as np
    
    m = 5
    ktr = np.zeros((2 * m, 2 * m), dtype=int)
    ktr[np.triu_indices(m, 1)] = 1
    

    ktr

    [[0 1 1 1 1 0 0 0 0 0]
     [0 0 1 1 1 0 0 0 0 0]
     [0 0 0 1 1 0 0 0 0 0]
     [0 0 0 0 1 0 0 0 0 0]
     [0 0 0 0 0 0 0 0 0 0]
     [0 0 0 0 0 0 0 0 0 0]
     [0 0 0 0 0 0 0 0 0 0]
     [0 0 0 0 0 0 0 0 0 0]
     [0 0 0 0 0 0 0 0 0 0]
     [0 0 0 0 0 0 0 0 0 0]]
    
    • 3
  2. ReinRaus
    2020-11-21T10:42:58Z2020-11-21T10:42:58Z

    在 BASIC 中,数组是二维的 10x10,在 Python 中是 2x10。当然不行。

    Python 中的整个循环很容易描述:

    m=5
    KTR = [ [0 if j<i+1 else 1 for j in range(1,m+1) ] for i in range(1,m) ]
    

    结果:

    [[0, 1, 1, 1, 1],
     [0, 0, 1, 1, 1], 
     [0, 0, 0, 1, 1], 
     [0, 0, 0, 0, 1]]
    

    出于某种原因,指定了数组的边界2*M,并且枚举仅达到M- 很可能这是防止超出数组限制的保险:那些用 BASIC 编写的人喜欢这样写。

    然而,这很容易修复。我们将边界扩展到2*M并同时将索引移动 1,因为在 Basic 中第一个数组索引是 1,而不是 0:

    KTR = [[None]*2*m]+[None]+[ [None]+[0 if j<i+1 else 1 for j in range(1,m+1) ]+[0]*m for i in range(1,m) ]+[ [None]+[0]*2*m for k in range(m+1) ]
    

    结果:

    [[None, None, None, None, None, None, None, None, None, None, None], 
     [None, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0], 
     [None, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0], 
     [None, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0], 
     [None, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], 
     [None, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [None, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [None, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [None, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [None, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [None, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
    

    现在,就像在 BASIC 中一样。

    好吧,一个简单(但无聊)的翻译,因为它是用 Python 从原始 BASIC 翻译过来的:

    m = 5
    KTR = [ [0]*(2*m+1) for k in range(2*m+1) ]
    for i in range(1,m):
        for j in range(i+1,m+1):
            KTR[i][j] = 1
    
    • 3

相关问题

  • TypeError:并非所有参数都在字符串格式化期间转换

  • 您需要创建一个函数(参数是一个 6 位数字的字符串)并按其值显示票证类型,如果前 3 个字符 = 3 个最后 - 快乐等。

  • 有必要显示英文字母表中所有唯一的元音,来自一个字符串,不区分大小写

  • 如何删除元组中的元素,元组在集合中

  • 函数,返回一个函数:print 打印 <function ...> 而不是一个值

  • python3中的int设备

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5