代码之家  ›  专栏  ›  技术社区  ›  Ymi

何时使用while循环与递归

  •  -1
  • Ymi  · 技术社区  · 4 年前

    我是一个初学者,我开始学习“while”语句循环来执行迭代。然而,早些时候我学习了“if/else”语句,以及如何通过返回变量来使用if/elsey执行递归。这是一个使用while语句的简单倒计时函数:

    def countdown(n):
        while n > 0:
            print(n)
            n = n-1
        print('Blast off!')
    

    为了进行比较,这里有一个使用if/else和递归的简单倒计时函数。

    def countdown(n):
        if n > 0:
            print(n)
            return countdown(n-1)
        elif n < 0:
            return None
        else:
            print('Blast off!')
            return
    

    正如你所看到的,这两个函数做的几乎完全相同,唯一的区别是if/else语句解释了n<0并返回None值,而“while”语句只是省略循环并打印“Blast off!”即使n<0无论如何。(如果有办法在while语句中考虑到这一点,我很乐意学习,请务必提出建议!)

    我的问题是,看看如何在if/else语句和while语句中完成同样的事情,反之亦然, 我想知道一个案例,其中它们被明确区分开来,一个明显优于另一个。我缺少的这两种语句之间是否存在微妙的概念差异,或者它们在用法上是否可以互换?

    2 回复  |  直到 4 年前
        1
  •  0
  •   Cresht    4 年前

    它们有着根本的不同。按照你描述它们的方式,两者都与for循环是一样的。(我无意冒犯) While 当你希望某事发生时,只要或直到其他事情发生。递归用于基于自身的函数。(常见的例子是阶乘或斐波那契数列)通常,它们的行为与你在小规模问题上描述的方式相似。然而,当扩大规模时,两者都有其优点和缺点。

    TLDR:函数在迭代方式上本质上是不同的。虽然它们都在迭代,但它们是基于不同的条件和不同的用例进行迭代的。

        2
  •  0
  •   Vaclav Vlcek    2 年前

    你实际上是对的,背后的逻辑是一样的,你也可以将while循环应用于例如斐波那契数列。递归的符号通常更短、更优雅。

    你的代码甚至可以简化一点,然后你会发现你的解决方案有点相似:

    While循环:

    def countdown(n):
        while n > 0: # Step 1 -> check
            print(n)
            n = n-1 # Step 2  -> recursive call in while loop
        print('Blast off!') # Step 3 -> end ensured by Step 1
    

    游览:

    def countdown(n):
        if n > 0: # Step 1 -> check
            print(n)  
            return countdown(n-1) # Step 2 -> recursive call of the countdown()
        else:
            print('Blast off!') # Step 3 -> end ensured by Step 1
    

    这一行动意义重大 n-1 。您递归地对变量或对象进行操作( Step 2 )只要与该变量/对象相关的条件有效( Step 1 ).