【问题标题】:Writing a recursive function in Python在 Python 中编写递归函数
【发布时间】:2017-10-13 08:35:59
【问题描述】:

假设存在一个名为 printStars 的函数,该函数可以传递一个包含非负整数值的参数。该函数打印出给定数量的星号。

编写一个名为 printTriangle 的函数,它接收一个包含非负整数值的参数并打印一个星号三角形,如下所示:首先是一行 n 个星号,然后是一行 n-1 个星号,然后是一行n-2 个星号,以此类推。

例如,如果函数接收到 5,它将打印

*****
****
***
**
*

该函数不得使用任何类型的循环(for、while、do-while)来完成其工作。该函数应调用 printStars 来完成打印单行的任务。

我相信我已经制定了基本案例。这是我的代码:

def printTriangle(n):
    if n == 1:
        printStars(n)

我需要一些帮助来确定递归步骤。我认为它使用 n-1 作为参数,但我不确定如何正确调用 printTriangle 函数。提前致谢。

【问题讨论】:

    标签: python-3.x recursion


    【解决方案1】:

    我们以n=5 为例。一个 5 行三角形

    *****    # 5 stars ...
    ****     # ...followed by a 4-row triangle
    ***
    **
    *
    

    只是一行 5 星,可使用printStars(5) 打印,然后是一个 4 行三角形,可使用printTriangle(4) 打印。类似地,4 行三角形只是一排 4 颗星,后跟一个 3 行三角形。通常,n-row 三角形只是一行n 星号,然后是n-1-row 三角形。正如一位老大学教授曾经告诉我们的那样,“相信你的递归”,他的意思是,在编写printTriangle 时,假设printTriangle 可以正常工作并尽可能使用它。您可以通过打印一行带有printStars(n) 的n 星号,然后是带有printTriangle(n-1) 的n-1-row 三角形来打印一个n-row 三角形。这意味着基本情况更简单:对于n=0,什么都不做!否则,打印一行n 星,然后在后面的较小三角形上递归。

    def printTriangle(n):
        if n == 0:
            # Base case
            return
        else:
            # Recursive case
            printStars(n)
            printTriangle(n-1)
    

    【讨论】:

    • 这很好用,但是有没有办法在每次打印星号后添加一个空格或换行符? printStars 函数已经定义了,所以我不能修改它,所以我想也许 print(printStars(n),end= '\n')) ?
    • 没有。 printStars 似乎直接打印到标准输出,而不是返回字符串,因此您无法真正影响该输出的显示方式。 (至少,不是以任何简单的方式。您可以重新定义 sys.stdout 以捕获和修改 printStars 打印的内容,但这仍然取决于 printStars 的实现方式,超出了本问题的范围。)
    【解决方案2】:

    递归的工作原理是将一个以n 为特征的问题实例缩减为以n-1 为特征的问题实例。要成为有限的,它必须停在某个实例n0。

    对于这个问题n是字符串的长度。

    • 因此,在实现f 时,如果您有一些函数可以处理打印所需长度为n-1 的字符串,您只需打印一个星号,然后调用该函数。诀窍是这个函数本身就是函数f。 对于长度为 0 的字符串,您不打印任何内容并返回。

    这将产生一个递归函数f,当以f(n) 调用时,它会打印一个n 星号字符串。

    接下来你通过提供一些函数g来处理三角形。

    • 如果使用参数0 调用它,它将返回并且什么都不做。 否则它将使用f(n) 打印一行,然后打印换行符 然后使用参数 n-1 调用自身。

    调用g(5) 应该会打印示例三角形。

    您应该为函数使用问题文本中较长的名称。

    【讨论】:

      【解决方案3】:

      打印 n 颗星,将 n 减 1,重复直到 n = 0

      def printTriangle(n):
          if n > 0:
              printStars(n)
              printTriangle(n-1)
      

      这个函数一直调用自己,直到 n 为 0

      【讨论】:

      • 不将 n 减一然后将 n-1 作为参数将 n 减 2 吗?
      • 我会删除n -= 1。
      【解决方案4】:
      def printTriangle(n):
        if n > 0:
          printStars(n)
          printTriangle(n-1)
      

      【讨论】:

        【解决方案5】:

        该函数打印n 星号,然后通过使用参数n - 1 调用自身来递减。所以基本情况应该是n 等于 1,因为进一步减少它是不合逻辑的。仅当n 大于 1 时才会发生递减。

        所以在伪代码中它是:

        function pstars(n)
            printStars(n)
        
            if (n > 1)
                pstars(n - 1)
        

        看看它是如何调用自己并递减 n 的?

        Python 代码中的剧透:

        def printTriangle(n): printStars(n) if n > 1: printTriangle(n - 1)

        【讨论】:

          【解决方案6】:

          添加一个 print 语句或类似的语句,以使每个递归步骤打印到一个新行。

          def printTriangle(n):
              if n == 0:
                  return
              if n > 0:
                  printStars(n)
                  print()
                  printTriangle(n-1)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-10-23
            • 1970-01-01
            • 1970-01-01
            • 2014-08-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多