我正在研究python中的递归函数,我不明白为什么这是错误的。 你能帮我吗?
这项工作是:
在下面的代码中,我实现了向用户请求字符串的递归实现,其中可能只使用小写字母。 当某人输入一个带有非法字符的字符串时,对函数本身的递归调用将请求一个新的字符串。 这看起来就像避免了使用循环半在不正确的输入上向用户询问新的输入。 虽然将对递归调用深度的控制交到用户手中总是一个糟糕的主意,但这种实现实际上不仅是糟糕的,而且是非常错误的。 你能看出它有什么问题吗?这是怎么引起的吗? (注意:它不是字母<'a'或字母>'z'表达式,这些比较都很好。)
def get_input( prompt ):
value = input( prompt )
for letter in value:
if letter < 'a' or letter > 'z':
print( "The character", letter, "is not allowed!")
value = get_input( prompt ) # DO NOT DO THIS!
return value
s = get_input( "Give a string of lower case letters: " )
print( "The user entered:", s )
让我再强调一次,上面的想法是一个糟糕的想法。 对于可以通过迭代解决的普通问题,不应该使用递归。 递归用于特殊情况。 不要把这看作一个递归的例子,把它看作一个如何不使用递归的例子! 我把它放在这里的主要原因是,我有时观察到学生编写这样的代码,我想明确地说明,那不是一个好主意!
键入“123456789”将导致get_input被调用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 )