python将伪代码转为代码时容易遇到range使用不正确的问题
前言算法课经常会将伪代码转成可运行代码,这时候如果遇到循环比较多的情况,容易搞不清楚for循环如何转成range(),导致数组越界问题,且较难排查,只能调试解决。本文将分享我在转化的过程中遇到的问题。下图为本文的样例伪代码编程语言:pythonpython的range()for i in range(a,b):print(i)对于上面这一行代码我们会输出a到b-1的结果,也...
·
前言
算法课经常会将伪代码转成可运行代码,这时候如果遇到循环比较多的情况,容易搞不清楚for循环如何转成range(),导致数组越界问题,且较难排查,只能调试解决。
本文将分享我在转化的过程中遇到的问题。下图为本文的样例伪代码
- 编程语言:python

python的range()
for i in range(a,b):
print(i)
对于上面这一行代码我们会输出a到b-1的结果,也就是range具有左包含右不包含的效果
样例伪代码分析
- 输入:A[1…n,1…n],B[1…n]
首先关注样例伪代码的输入,我们知道在python中,数组是从0开始计算的,也就是转为python的输入的话,这里应该是A[0..n-1,0..n-1]和B[0..n-1]
同理,图中伪代码for循环部分,用的是from i=1 to n,所以我们应该转成for i in range(0,n)
问题来了,对于from i=1 to n=>for i in range(0,n)
如果是from j=i to n呢,是不是转换成for j in range(i-1,n)呢
其实是不正确的,正确的转换是:from j=i to n=>for j in range(i,n)
可以这样理解,在上一步对i的转换时,已经考虑到了这个数组从0开始的问题,如果你将i赋值给j,显然j就不存在转换问题了,因为i==j
转化后代码分享
# python 3
def ForwardElimination(A,B):
n=len(B)
for i in range(0,n):
A[i].append(B[i])
for i in range(0,n-1):
pivotrow = i
for j in range(i+1,n):
if abs(A[j][i])>abs(A[pivotrow][i]):
pivotrow = j
for k in range(i,n+1):
A[i][k],A[pivotrow][k] = A[pivotrow][k],A[i][k]
for j in range(i+1,n):
temp = A[j][i] / A[i][i]
for k in range(i,n+1):
A[j][k] = A[j][k] - A[i][k] * temp
return A
总结
在转换过程中有两种情况:
- 常数转换
from i=a to b - 赋值转换
from j=i to b
对于常数转换,转换为for i in range(a-1,b)
对于赋值转换,转换为for j in range(i,b)
也就是常数左减一,其余均不变
更多推荐



所有评论(0)