Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对用户的递归调用’;手_Python_Function_Recursion - Fatal编程技术网

Python 对用户的递归调用’;手

Python 对用户的递归调用’;手,python,function,recursion,Python,Function,Recursion,我正在研究python中的递归函数,我不明白为什么这是错误的。你能帮我吗 这项工作是: 在下面的代码中,我实现了一个要求用户输入字符串的递归实现,其中只能使用小写字母。当有人输入一个包含非法字符的字符串时,对函数本身的递归调用将要求输入一个新字符串。这看起来可以避免使用半循环来要求用户输入错误输入的新输入。虽然将递归调用深度的控制权交给用户总是一个坏主意,但这种实现实际上不仅不好,而且是完全错误的。你能看到它有什么问题吗?它是如何造成的?(注意:这不是字母'z'表达式,这些比较很好。) def

我正在研究python中的递归函数,我不明白为什么这是错误的。你能帮我吗

这项工作是:

在下面的代码中,我实现了一个要求用户输入字符串的递归实现,其中只能使用小写字母。当有人输入一个包含非法字符的字符串时,对函数本身的递归调用将要求输入一个新字符串。这看起来可以避免使用半循环来要求用户输入错误输入的新输入。虽然将递归调用深度的控制权交给用户总是一个坏主意,但这种实现实际上不仅不好,而且是完全错误的。你能看到它有什么问题吗?它是如何造成的?(注意:这不是字母<'a'或字母>'z'表达式,这些比较很好。)

def get_输入(提示):
值=输入(提示)
对于大写字母:
如果字母<'a'或字母>'z':
打印(“不允许使用字符字母!”)
value=get_input(prompt)#不要这样做!
返回值
s=获取输入(“给出一个小写字母字符串:”)
打印(“用户输入:”,s)
让我再次强调,上面的想法是不好的。对于可以通过迭代解决的常见问题,不应该使用递归。递归适用于特殊情况。不要将此视为递归的示例,而应将其视为如何不使用递归的示例!我把它放在这里的主要原因是,我有时观察学生写这样的代码,我想明确指出,这不是一个好主意

键入“123456789”将导致get_输入被调用9次,因为for循环必须迭代并拒绝所有9个字符,并在返回值之前递归调用自身9次。
一个简单的修复方法是放置一个return,而不是
value=
,让它立即终止函数,并返回从递归调用检索到的下一个有效输入

def get_input( prompt ):
    value = input( prompt )
    for letter in value:
        if letter < 'a' or letter > 'z':
           print( "The character", letter, "is not allowed!")
           return get_input( prompt ) # re-prompt for input and return (and exit function)
    return value

s = get_input( "Give a string of lower case letters: " )
print( "The user entered:", s )
def get_输入(提示):
值=输入(提示)
对于大写字母:
如果字母<'a'或字母>'z':
打印(“不允许使用字符字母!”)
return get_input(prompt)#重新提示输入并返回(和退出功能)
返回值
s=获取输入(“给出一个小写字母字符串:”)
打印(“用户输入:”,s)

您的缩进在编辑后是错误的,但书的作者提到代码逻辑中的错误。我找不到问题所在。它会递归调用出现的每个错误字符,而不是在任何字符无效之后。因此,如果我输入123456789,它将调用get_input 9次。我想一个简单的“修复”方法是在获取输入之前输入一个返回值,而不是value=Thank you。这是这个代码唯一的问题吗?我的意思是没有概念上的错误?这本身就是概念上的错误,因为您希望它在找到第一个无效字符后拒绝(或者只是检查并设置布尔标志true或false或类似的东西)(例如,您可以实现它来抱怨找到的所有无效字符,并且只有在它检查完所有字符(例如:for循环之后)后才递归调用)。如果您调用所有这些输入,它将对其进行9次迭代并覆盖输入,因此当您输入有效的内容时,它将继续运行,并用以后可能有效或可能无效的输入覆盖其值放弃有效。
def get_input( prompt ):
    value = input( prompt )
    for letter in value:
        if letter < 'a' or letter > 'z':
           print( "The character", letter, "is not allowed!")
           return get_input( prompt ) # re-prompt for input and return (and exit function)
    return value

s = get_input( "Give a string of lower case letters: " )
print( "The user entered:", s )