0
def Help(string):
    while True:
        if string == 'Manifest':
            return Manifest()
            break
        elif string == 'Intent':
            return Intent()
            break
        else:
            print('The options available are: \n')
            for i in andHelp:
                print(i)
            print('Type Q to Quit \n')
            x = input('What option do you choose: ')
            print('\n')
            if x == 'Q':
                break
            else:
                Help(x)

如果它进入 else 语句它会继续循环,怎么会?例如:

“可用的选项是:

意图

显现

键入 Q 退出

您选择什么选项:“ <--这将与我选择的功能一样不断出现。

4

2 回答 2

1

您甚至不需要 while 循环来检查您正在检查的内容。改用这个:

def Help(string):
    if string == 'Manifest':
        return Manifest()
    elif string == 'Intent':
        return Intent()
    else:
        print('The options available are:\n%s\nType Q to Quit\n' % '\n'.join(andHelp))
        x = input('What option do you choose: ')
        print('\n')
        if x != 'Q':
            Help(x)

注意:我稍微修改了您的打印以减少实际上不需要的额外行。
注意2:正如您在评论中看到的那样,没有限制地递归执行此操作可能很危险,因为您可能会达到最大深度级别。

于 2013-02-24T15:24:48.647 回答
1

您的实际问题是由于您的递归实际上并未返回内部框架的值,但消除递归似乎是一个更直接的解决方案。

这样做的愚蠢之处在于在循环中进行递归。递归和循环都有相同的目的:让option选择不断发生,直到给出一个有效的选项。所以你绝对可以消除一个:

def Help(string):
    while True:
        if string == 'Manifest':
            return Manifest()
            break
        elif string == 'Intent':
            return Intent()
            break
        else:
            print('The options available are: \n')
            for i in andHelp:
                print(i)
            print('Type Q to Quit \n')
            string = input('What option do you choose: ') # Change `x` to `string` so next iteration will change behavior
            print('\n')
            if string == 'Q':
                break

正如Inbar Rose 的回答所指出的那样,您可以通过递归大大缩短此时间,但由于 Python 需要递归限制,您可以通过强制其递归超出该限制来使程序崩溃。所以也许坚持循环会更好。string无论如何,您可以通过验证循环本身的条件来进一步清理它:

def Help(string):
    validOptions = ('Manifest', 'Intent', 'Q')

    while string not in validOptions:
        print('The options available are: \n')
        for i in andHelp:
            print(i)
        print('Type Q to Quit \n')
        string = input('What option do you choose: ')
        print('\n')

    # Now you have a guaranteed-valid string, so you don't need this part in the loop.
    if string == 'Manifest':
        return Manifest() # No need for a 'break' after a return. It's [dead code](http://en.wikipedia.org/wiki/Dead_code)
    elif string == 'Intent':
        return Intent()
    elif string == 'Q':
        return
于 2013-02-24T15:57:10.797 回答