在Python中编写递归函数

时间:2014-11-06 19:28:00

标签: python-3.x recursion

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

编写一个名为printTriangle的函数,它接收一个包含非负整数值的参数,并按如下方式打印一个星号三角形:首先是一行n个星号,然后是一行n-1个问号,然后是一行n-2个星号,等等。

例如,如果函数收到5,则会打印

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

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

我相信基本情况已经解决了。这是我的代码:

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

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

6 个答案:

答案 0 :(得分:3)

递归通过将以n为特征的问题实例减少为以n-1为特征的实例来实现。要有限,它必须在某个实例n0停止。

对于此问题,n是字符串的长度。

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

这将产生一个递归函数f,在调用n时打印一串f(n)个星号。

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

  • 如果使用参数0调用它,它将返回并且不执行任何操作。 否则,它将使用f(n)打印一行,然后打印换行符 然后用参数n-1调用自己。

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

您应该使用问题文本中较长的名称来表示这些功能。

答案 1 :(得分:3)

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

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

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

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

答案 2 :(得分:1)

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

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

此函数一直调用自身,直到n为0

答案 3 :(得分:1)

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

答案 4 :(得分:1)

该函数打印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)

答案 5 :(得分:0)

添加一个print语句或一些等价物,以使每个递归步骤打印到一个新行。

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