递归倒三角形

时间:2018-10-04 17:28:45

标签: python recursion

我应该创建一个递归语句,如果首先调用triangle(n),它将返回

'******\n *****\n ****\n ***\n **\n *'

上面的这个称为三角形(6),如果我打印(三角形(6)),它会返回下面。

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

然后,我必须创建另一个代码recursive_triangle(x,n),该代码返回一个字符串,该字符串包含底数为n且高度为n的直角三角形的最后x行。例如,如果我做了recursive_triangle(3,6),它将返回

'   ***\n    **\n     *'

如果我打印,它应该返回

***
 ** 
  *

到目前为止,我的代码是

#### DO NOT modify the triangle(n) function in any way! 
def triangle(n):
    return recursive_triangle(n, n)
###################


def recursive_triangle(k, n=0):
    '''
    Takes two integers k and n
    >>> recursive_triangle(2,4)
    '  **\\n   *'
    >>> print(recursive_triangle(2,4))
      **
       *
    >>> triangle(4)
    '****\\n ***\\n  **\\n   *'
    >>> print(triangle(4))
    ****
     ***
      **
       *
'''
    # --- YOUR CODE STARTS HERE
    if n == 1:
        return "*"


    else:
        for i in range(1, n+1):
            return ("*" *n) + "\n" + (' ' * i) + triangle (n - 1)

对于print(triangle(4)),这就是我得到的

****
 ***
 **
 *

如何修改代码以获取上面的输出?

4 个答案:

答案 0 :(得分:0)

您的递归案例格式不正确:

else:
    for i in range(1, n+1):
        return ("*" *n) + "\n" + (' ' * i) + triangle (n - 1)

首先,此代码在一次迭代后返回:return结束了函数实例,因此i永远不会达到2的值。您需要做一些简单的事情,然后重复进行一个简单的案例来处理其余的问题。

接下来,triangle仅用于呼叫recursive_triangle。然后,recursive_triangle需要调用本身,而不是循环回到triangle

最后,请注意,recursive_triangle会完全忽略参数k。该值对于确定在行中放置星号的位置至关重要。

recursive_triangle的每个实例都应产生三角形的单行(您具有正确的值),然后将该行与三角形的其余部分连接起来,然后将整个连接后的整型返回给调用它的实例。您会想要大致类似的东西:

else:
    line = ... # build a line of k-n spaces and n asterisks
    return line + recursive_triangle(k, n-1)

可以从那里拿走吗?除其他事项外,请记住插入一些有用的print命令来跟踪您的执行流和生成的值。

答案 1 :(得分:-1)

首先,有更好的方法可以实现这一目标。 但是,如果您确实想采用这种方式,则以下代码可以解决间距问题。

my_db:my_dataset.my_table

为您提供

#### DO NOT modify the triangle(n) function in any way! 
def triangle(n):
    return recursive_triangle(n, n)
###################


def recursive_triangle(k, n=0):
    '''
    Takes two integers k and n
    >>> recursive_triangle(2,4)
    '  **\\n   *'
    >>> print(recursive_triangle(2,4))
      **
       *
    >>> triangle(4)
    '****\\n ***\\n  **\\n   *'
    >>> print(triangle(4))
    ****
     ***
      **
       *
'''
    # --- YOUR CODE STARTS HERE
    if n == 1:
        return "*"


    else:
        for i in range(1, n+1):
            return ("*" *n) + "\n" + (' ' * i) + triangle (n - 1).replace("\n", "\n ")

在Python 3.6.5中。

答案 2 :(得分:-1)

您可以使用r对行进行计数,并使用辅助参数来计算空格s

def triangle (r = 0, s = 0):
  if r is 0:
    return ""
  else:
    return (" " * s) + ("*" * r) + "\n" + triangle (r - 1, s + 1)

print (triangle(5))
# *****
#  ****
#   ***
#    **
#     *

答案 3 :(得分:-1)

code.py

#!/usr/bin/env python3

import sys


#### DO NOT modify the triangle(n) function in any way! 
def triangle(n):
    return recursive_triangle(n, n)
###################


def recursive_triangle(k, n=0):
    '''
    Takes two integers k and n
    >>> recursive_triangle(2,4)
    '  **\\n   *'
    >>> print(recursive_triangle(2,4))
      **
       *
    >>> triangle(4)
    '****\\n ***\\n  **\\n   *'
    >>> print(triangle(4))
    ****
     ***
      **
       *
    '''
    # --- YOUR CODE STARTS HERE

    if k == 0:
        return ""
    else:
        return "\n".join(["".join([" " * (n - k), "*" * k]), recursive_triangle(k - 1, n)])
        #return " " * (n - k) + "*" * k + "\n" + recursive_triangle(k - 1, n)


def main():
    print("triangle(6):\n{:s}".format(triangle(6)))
    print("recursive_triangle(3, 6):\n{:s}".format(recursive_triangle(3, 6)))
    print("repr recursive_triangle(2, 4): {:s}".format(repr(recursive_triangle(2, 4))))
    print("repr triangle(4): {:s}".format(repr(triangle(4))))


if __name__ == "__main__":
    print("Python {:s} on {:s}\n".format(sys.version, sys.platform))
    main()

注释

  • 为简化起见,您可以查看recursive_triangle(k, n)的参数含义,例如:
    • k :递归步骤,以及“ * ”字符的数量。每次递归函数调用都会减少
    • n :1 st (最长)三角线长度( SPACE s + k 的数量) 。在递归中保持不变
  • 当前行包含 n-k SPACE ,后跟 k * ”(总共 n 个字符)。行通过[Python 3]: str.join(iterable)(或在下一条带注释的行中“手动”)连接在一起
  • 该函数将自行调用,直到不再有 “ *” 个字符( k 变为 0

输出

(py35x64_test) e:\Work\Dev\StackOverflow\q052652407>"e:\Work\Dev\VEnvs\py35x64_test\Scripts\python.exe" code.py
Python 3.5.4 (v3.5.4:3f56838, Aug  8 2017, 02:17:05) [MSC v.1900 64 bit (AMD64)] on win32

triangle(6):
******
 *****
  ****
   ***
    **
     *

recursive_triangle(3, 6):
   ***
    **
     *

repr recursive_triangle(2, 4): '  **\n   *\n'
repr triangle(4): '****\n ***\n  **\n   *\n'