递归颠倒三角形



我应该创建一个递归语句,如果第一次调用triangle(n(,它会返回

'******n *****n ****n ***n **n *'

上面称为三角形(6(,如果我打印(三角形(6((,它将返回下面。

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

然后我必须创建另一个代码 recursive_triangle(x, 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)

对于打印(三角形(4(( 这就是我得到的

****
***
**
*

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

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

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命令来跟踪您的执行流和生成的值。

首先,有更好的方法来实现这一点。 但是,如果您真的想这样做,以下代码可以解决间距问题。

#### 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 中。

您可以使用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))
# *****
#  ****
#   ***
#    **
#     *

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:1st(最长(三角形线长度(空格s +k的数量(。在递归中保持不变
  • 当前行包含 n-k空格s,后跟k">*" s(总共n个字符(。行通过 [Python 3] 连接在一起:str.join(iterable((或"手动",在(下一个(注释行中(
  • 函数调用自身,直到不再有"*">字符(k变为0(

输出

(py35x64_test) e:WorkDevStackOverflowq052652407>"e:WorkDevVEnvspy35x64_testScriptspython.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'

最新更新