在Python中,函数重调用(递归)与使用while语句的比较

3 投票
4 回答
2595 浏览
提问于 2025-04-16 17:39

好的,我知道可以用while语句让一个程序在某个条件为真的时候一直运行。不过,在else条件里像下面这样重新调用函数,是不是不对或者不好的做法呢?

def ask():
    me = input("What is your name? ")

    if me == "Tom":
        print("Hi, Tom!")
    else:
        print ("Who are you?")
        ask()

这看起来只是'while语句'的一个更简单、简洁的版本,但我在Python教程里没见过这样执行程序。

4 个回答

0

你说的是简写吗?跟下面这个比起来:

def ask():
    while input("What is your name? ") != "Tom":
        print ("Who are you?")
    print("Hi, Tom!")
1

我觉得这并不是坏习惯,除非你预计会有成百上千次的递归调用,或者在你的应用中内存管理特别重要。

正如其他回答所说,Python不支持尾递归消除,这意味着对同一个函数的递归调用不需要在栈上增加新的栈帧。这样可以避免浪费不必要的内存。

如果你对为什么Python的创造者Guido认为尾递归消除不符合Python风格感兴趣,可以看看这篇文章:http://neopythonic.blogspot.com/2009/04/tail-recursion-elimination.html

3

老实说,这两种方法都“有效”,关键在于你具体的使用场景。确实,使用递归时更容易遇到深度限制的问题,而用循环的话,出错的可能性相对较小。其实,使用while循环会更简单,而且在我看来,在这个特定情况下,它更符合Python的风格(为什么要让事情变得更复杂呢?)

撰写回答