如何在没有递归的情况下实现此功能?

时间:2016-11-16 16:58:01

标签: python list function python-3.x menu

我正在尝试做一个宾果游戏,我有一些努力,但最终解决了它。 然而,我的主要“问题”(更像是,我听说它的编程错误)是我的函数我在其他语句中调用我的函数。我不认为这是你想要做的,我没有找到任何解决方法但是..因为这个函数是从另一个叫做menu()的函数调用所以当我使用循环时,它会回到菜单如果不对。

这是我的代码:

def selectingNumbers():
    numbers = []
    dupl = []
    j = 0
    print("Now you are gonna select 5 number\n")
    while j < 5:
        nummer = int(input("Your choice:\n"))
        numbers.append(int(nummer))
        j = j+1
    for i in numbers:
        if i not in dupl:
            dupl.append(i) #New list without duplicates
    if dupl == numbers: #Comparing new list with old list
        print("No equal numbers found")
        dragning(numbers)
    else:
        print("Equal numbers found")
        selectingNumbers() #Is there a better way to do it?

我在开头的列表中也遇到了一些问题,我知道我可以使用set()函数,但是我想保留原始列表,并将新列表与旧列表进行比较,我可以这样做吗?用“真正的”编程而不是导入模块更好的方式?

希望你能用替代方案回答或指导我这两个问题,如果是的话,请说明为什么我的代码“坏”,如果是的话。

2 个答案:

答案 0 :(得分:0)

那么你必须决定是否要使用递归来解决问题。这一行是一个递归调用:

 selectingNumbers() #Is there a better way to do it?

哪个好,并不等于糟糕的编程。但是,您的其余功能无法满足递归功能。您重置变量,因此没有真正的基本情况。有关示例,请参阅google或here

递归让初学者感到困惑,所以我会采用迭代方法。 Here is a bingo python example

另外,我不确定这条线是否有效:

if dupl == numbers:  #Comparing new list with old list

我对python不太熟悉,但根据我的经验,数组被视为对象,因此在该行中你会要求python将两个单独的对象与内存中的唯一引用进行比较。所以它们永远不会是平等的,即使它们内部的值是相同的,因为它们都是单独引用的。 I found this link to answer that concern.

答案 1 :(得分:0)

递归不是&#34;坏&#34;。事实上,它有时可以大大简化问题的解决方案。但是,对于您的代码,它是不必要的。幸运的是,它有时可以用循环替换。对于您的代码,它看起来可能只是循环,直到它从用户获得不包含任何重复项的列表。这意味着它可以重写如下所示(我还简化了其他一些事情):

def selectingNumbers():
    while True:
        print("Now you are gonna select 5 different numbers\n")
        numbers = []
        for _ in range(5):
            number = int(input("Your choice:\n"))
            numbers.append(number)

        unique = set(numbers)  # will remove any duplicates

        if len(unique) == len(numbers):  # no dups?
            print("No equal numbers found")
            break  #  <--- terminates loop
        else:
            print("Equal numbers found")
            # allow loop to continue

    dragning(numbers)