关于递归:跳转它数字游戏 – Python

Jump It Number Game - Python

我正在尝试创建一个简单的"跳转"游戏,它应该把一行中的数字(从文件中获得的输入)取出来,然后找到最便宜的路径到达终点。它将位置1和位置2中的数字进行比较,找出哪一个较小,然后将其添加到总"成本"中,然后继续到下两个。

因此,对于0 3 80 6 57 10号线,最便宜的路线是3+6+10,总共19条。当前我得到的错误是"索引超出范围",我如何修复此错误?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def shouldJump(A):
    cost = []
    for line in A[0]:
        if (A[1] > A[2]):
            cost.append(A[1])
            shouldJump(A[2:])
        elif(A[1] < A[2]):
            cost.append(A[2])
            shouldJump(A[2:])
        elif(A[0]==''):
            shouldJump(A[1][1:])
        print(cost, end='
'
)

def main():
    # This opens the file in read mode
    filename = open('input.dat', 'r')
    # Read in all the lines of the file into a list of lines
    linesList = filename.readlines()
    rows = [[int(n) for n in row.split()] for row in linesList]
    myData = [[int(val) for val in line.split()] for line in linesList[1:]]
    shouldJump(myData)
main()


这里有一个用Python 2.7编写的简单递归代码。看看:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def shouldJump(A,i,n):
  if i>n-1:
    return 0
  elif i+1>n-1:
    return A[i]
  else:
    if A[i]<A[i+1]:
      return A[i] + shouldJump(A,i+2,n)
    else:
      return A[i+1] + shouldJump(A,i+2,n)


A = [[0,3,80,6,57,10],[0,1,5,7,2]]
cost = []
for line in A:
  cost.append(shouldJump(line,1,len(line)))

print cost

输出:[19, 3]

希望有帮助!!!!


您可以通过一行列表理解来实现这一点(不是递归的;使用递归的要求是在后面添加的,咕哝着):

1
2
min_cost = sum(min(pair) for pair in zip(A[::2], A[1::2]))
16

如果你想要"最小路径"的话:

1
2
min_route = [min(pair) for pair in zip(A[::2], A[1::2])]
[0, 6, 10]

其中"pairs"习语取自单个列表中的pairs


这是一个简单的方法

1
2
3
cost = 0
for pair in izip_longest(fillvalue=max(A) + 1, *[iter(A)] * 2):
    cost += min(pair)

参见https://docs.python.org/2/library/itertools.html配方中的grouper配方