前言

算法课经常会将伪代码转成可运行代码,这时候如果遇到循环比较多的情况,容易搞不清楚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)

也就是常数左减一,其余均不变

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐