为什么这个Python脚本偶尔是递归的?

2024-09-25 08:40:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在自学Python,并编写了一个交换圣诞礼物的小脚本(这不是家庭作业)。我的家人喜欢每个人给同一性别的人一份礼物。下面的脚本大部分时间都可以工作,但有时由于无限递归而失败。我不知道为什么,因为我认为基本情况最终会得到满足。在

import random

family = {'Joe': 'm', 'Jane': 'f', 'John': 'm', 'Jill': 'f', 'James': 'm', 'Jade': 'f'}
receivers = family.copy()
givers = family.copy()

def match(giver):
    index = random.randrange(len(receivers))
    giverGender = givers[giver]
    receiver = receivers.keys()[index]
    receiverGender = receivers.values()[index]

    if giver != receiver and giverGender == receiverGender:
        del receivers[receiver]
        return giver + ' to ' + receiver
    else:
        return match(giver)

# main program
for i in givers:
    print match(i)

以下是错误(编辑以添加完整错误):

^{pr2}$

谢谢你的帮助。在


Tags: 脚本indexreturnmatch错误randomfamilycopy
3条回答

下面是脚本的一个简单的迭代变体。效果很好。在

作为一个假设,我认为,根据概率论,有时你只是调用匹配函数太多次,所以它导致程序达到递归极限

import random

family = {'Joe': 'm', 'Jane': 'f', 'John': 'm', 'Jill': 'f', 'James': 'm', 'Jade': 'f'}
receivers = family.copy()
givers = family.copy()

def match(giver):
    giverGender = givers[giver]

    Found = False
    while not Found:
        index = random.randrange(len(receivers))
        receiver = receivers.keys()[index]
        receiverGender = receivers.values()[index]
        if giver != receiver and giverGender == receiverGender:
            Found = True
            del receivers[receiver]
    return giver + ' to ' + receiver


# main program
if __name__=='__main__':
    for i in givers:
        print match(i)

首先让我们考虑一下女人。如果你的程序运行并且匹配了Jane和Jill,然后匹配了Jill和Jane,Jane是剩下的唯一一个女性,因为她不能匹配自己,你的程序将无限期地运行,没有匹配项。在

让我提出另一种方法来解决你的问题。随机改变送礼人/收礼人的顺序,让每个人送礼给列表中的下一个人,让列表中最后一个人作为第一个人送礼。看起来像这样:

from random import shuffle
women = ['Jane', 'Jill', 'Jade']
shuffle(women)
print women[-1] + ' to ' + women[0]
for i in range(len(women) - 1):
    print women[i] + ' to ' + women[i+1]

简对吉尔,吉尔对简

玉给谁?在

相关问题 更多 >