这段简单的代码完美无缺。我要问的是完全没必要的;但是,我正在尝试更多地了解函数式编程方法。
p=[0, 1, 0, 0, 0]
pHit = 0.6
pMiss = 0.2
pExact = 0.8
pOvershoot = 0.1
pUndershoot = 0.1
def move(p, U):
q = []
# A functional approach could be used here as well, but focusing on the outer loop at the moment.
for i in range(len(p)):
s = pExact * p[(i-U) % len(p)]
s = s + pOvershoot * p[(i-U-1) % len(p)]
s = s + pUndershoot * p[(i-U+1) % len(p)]
q.append(s)
return q
#Instead of this for loop here, is there a more functional approach to doing the same thing?
for i in range(0,1000):
p = move(p,1)
print move(p,1)
这个人提出了类似的问题,但区别在于他/她正在将递归函数应用于迭代的实际对象。 Using recursion with map in python
我的情况似乎有所不同,因为我没有迭代我正在应用递归函数的对象(列表“p”)。 “for循环”处理得非常好,因为我想做递归操作范围(0,1000)次,但我已经看到这个问题现在出现了几次,我对看到函数式编程非常感兴趣解决这个问题。
我曾尝试使用reduce()
几次,但我发现很难将X迭代的输出传递给X + 1迭代。
答案 0 :(得分:3)
要替换底部的循环,您可以执行以下操作:
reduce(lambda q,_: move(q, 1), range(1000), p)
请注意,范围的值从未被使用过,因此使用_
表示它们无关紧要。
缩减会自动将move
的结果传递给下一次迭代。