感谢@chepner解决了这个问题!
我正在www.edabit.com上进行算法挑战,那里有骰子掷骰列表,并且:
如果数字为6,则列表中的下一个数字将放大2倍。
如果数字为1,则列表中的下一个数字为0
这是我的代码:
def rolls(lst):
out = 0
iterate = 0
if lst[iterate] == 1:
out+=lst[iterate]
lst[iterate+1] = 0
iterate+=1
rolls(lst[iterate])
elif lst[iterate] == 6:
out+=lst[iterate]
lst[iterate+1] = lst[iterate+1]*2
iterate+=1
rolls(lst[iterate])
else:
out+=lst[iterate]
iterate+=1
控制台显示“ TypeError:'int'对象不可下标”
有什么想法吗?同样,您发现的其他任何错误也会很有用。
我尝试了其他IDE,但是它提供了相同的输出。
对于“ 1、6、2、3、2、4、5、6、2”这样的系列,我希望27
答案 0 :(得分:0)
如评论中所述,对于此类问题,我不会使用递归。循环就足够了:
l = [1, 6, 2, 3, 2, 4, 5, 6, 2]
from itertools import accumulate
print(sum(accumulate([0] + l, lambda a, b: b*{1:0, 6:2}.get(a, 1))))
打印:
27
答案 1 :(得分:0)
如果必须使用递归解决此问题,则需要传递两个参数,第一个参数lst和第二个参数迭代。请注意,lst [iterate]是一个元素,您在递归调用该函数时会将其传递给该函数。
因此将函数修改为带有两个参数lst并进行迭代。最初将参数传递为lst的完整列表,将0传递为迭代。 rolls(lst,0)应该是您的初始函数调用。
我想您希望变量在访问它们时包含lst中所有条目的总和,因此也需要将其作为参数传递,从而使您的初始调用成为rolls(lst,0,0)。我已经对函数进行了编辑,以相应地返回计算出的总和。
def rolls(lst, iterate, out):
if iterate == len(lst):
return out
if lst[iterate] == 1:
out += lst[iterate]
if iterate + 1 < len(lst): #In order to avoid index out of bounds exception
lst[iterate + 1] = 0
rolls(lst, iterate + 1, out)
elif lst[iterate] == 6:
out += lst[iterate]
if iterate + 1 < len(lst): #In order to avoid index out of bounds exception
lst[iterate + 1] = lst[iterate + 1] * 2
rolls(lst, iterate + 1, out)
else:
out += lst[iterate]
rolls(lst, iterate+1, out)
答案 2 :(得分:0)
您可以查看上一个项目,而不是查看下一个项目:
from itertools import islice
def rolls(lst):
if not lst:
return 0
total = prev = lst[0]
for x in islice(lst, 1, None):
if prev == 1:
x = 0
elif prev == 6:
x *= 2
prev = x
total += x
return total
例如:
>>> rolls([1, 6, 2, 3, 2, 4, 5, 6, 2])
27
>>> rolls([])
0
>>> rolls([1])
1
>>> rolls([2])
2
>>> rolls([3])
3
>>> rolls([4])
4
>>> rolls([6,1])
8
>>> rolls([6,2])
10
>>> rolls([6,1,5])
13