首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >与递归函数斗争,我做错了什么?

与递归函数斗争,我做错了什么?
EN

Stack Overflow用户
提问于 2014-02-19 09:05:09
回答 4查看 326关注 0票数 1

我对python相当陌生,我理解递归是一个需要掌握的重要概念。我一直在尝试各种脚本来运用我的知识,并想出了下面的脚本来模拟彩票抽奖,你只需从49个数字中抽取6个,然后将它们与另外6个数字进行比较,看看你是否中奖了。不过,我正在努力使用带有另一个函数的值的递归函数。

我相信这会是直截了当的,但我自己也无法理解。

到目前为止,这是我的代码:

代码语言:javascript
运行
复制
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())

然后递归地得到以下内容。

代码语言:javascript
运行
复制
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())
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-02-19 09:09:35

代码语言:javascript
运行
复制
def lottery(draw,ticket):
    if draw == ticket:
        return 'win'
    return lottery(drawSix(),drawSix())

实际上生成两张相同的票的概率相当大,远远超过1000,这是Python的最大堆栈大小。

您需要迭代地这样做,以避免引发堆栈。

代码语言:javascript
运行
复制
def lottery(draw,ticket):
    while draw != ticket:
        draw, ticket = drawSix(), drawSix()
    return "win"

注意,这有一个非常丑陋的O(n) of O(inf),如果你运气不佳,仍然找不到赢家的话,你可能会永远运行这个程序。

票数 5
EN

Stack Overflow用户

发布于 2014-02-19 09:16:51

嗯,你的问题已经回答了,但是我建议你改变你的drawSix函数。就像现在一样,从技术上讲,它可以永远运行下去。random有一个生成唯一数字的sample方法。

代码语言:javascript
运行
复制
def drawSix():
    return sorted(random.sample(range(1, 50), 6))
票数 2
EN

Stack Overflow用户

发布于 2014-02-19 09:13:15

是的-- lottery函数将继续调用自己,每次将自己的新版本放入调用堆栈中,就会越来越深入,直到有两个匹配的数字为止。

这可能需要很长时间,Python最终会说:“喂!住手!”还有撞车。

有些编程语言有一个名为“尾调用优化”的特性,这意味着如果您尝试return相同函数的结果,而不是在当前函数中对函数进行新的调用,它只是在堆栈中替换自己。

Python不会这么做的。

代码语言:javascript
运行
复制
def lottery():
    while (drawSix() != drawSix()):
        continue
    return 'win!'

将具有与递归版本相同的效果,但不会因递归错误而死亡。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21875590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档