我对python相当陌生,我理解递归是一个需要掌握的重要概念。我一直在尝试各种脚本来运用我的知识,并想出了下面的脚本来模拟彩票抽奖,你只需从49个数字中抽取6个,然后将它们与另外6个数字进行比较,看看你是否中奖了。不过,我正在努力使用带有另一个函数的值的递归函数。
我相信这会是直截了当的,但我自己也无法理解。
到目前为止,这是我的代码:
from random import randint
def drawSix():
six = []
while len(six) < 6:
a = randint(1,49)
if a not in six:
six.append(a)
return sorted(six)
def lottery(draw,ticket):
if draw == ticket:
return 'win'
return lottery(drawSix(),drawSix())
我用抽奖来调用函数(drawSix(),drawSix())
然后递归地得到以下内容。
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
lottery(drawSix(),drawSix())
File "/Users/johnhopkins/Desktop/lottery.py", line 14, in lottery
return lottery(drawSix(),drawSix())
发布于 2014-02-19 09:09:35
def lottery(draw,ticket):
if draw == ticket:
return 'win'
return lottery(drawSix(),drawSix())
实际上生成两张相同的票的概率相当大,远远超过1000,这是Python的最大堆栈大小。
您需要迭代地这样做,以避免引发堆栈。
def lottery(draw,ticket):
while draw != ticket:
draw, ticket = drawSix(), drawSix()
return "win"
注意,这有一个非常丑陋的O(n)
of O(inf)
,如果你运气不佳,仍然找不到赢家的话,你可能会永远运行这个程序。
发布于 2014-02-19 09:16:51
嗯,你的问题已经回答了,但是我建议你改变你的drawSix
函数。就像现在一样,从技术上讲,它可以永远运行下去。random
有一个生成唯一数字的sample
方法。
def drawSix():
return sorted(random.sample(range(1, 50), 6))
发布于 2014-02-19 09:13:15
是的-- lottery
函数将继续调用自己,每次将自己的新版本放入调用堆栈中,就会越来越深入,直到有两个匹配的数字为止。
这可能需要很长时间,Python最终会说:“喂!住手!”还有撞车。
有些编程语言有一个名为“尾调用优化”的特性,这意味着如果您尝试return
相同函数的结果,而不是在当前函数中对函数进行新的调用,它只是在堆栈中替换自己。
Python不会这么做的。
def lottery():
while (drawSix() != drawSix()):
continue
return 'win!'
将具有与递归版本相同的效果,但不会因递归错误而死亡。
https://stackoverflow.com/questions/21875590
复制相似问题