我如何在我的递归问题中解决这个空白问题



LAB:画一个直角向上的三角形

写一个递归函数draw_triangle(),输出*的直线形成一个直角向上的等腰三角形。函数draw_triangle()有一个参数,一个表示三角形底边长度的整数。假设底边长度总是奇数且小于20。在第一行的第一个*前输出9个空格,以便正确格式化。

提示:每画一条线,*的数量增加2。

示例:如果程序的输入是:

3

函数draw_triangle()输出:

*
***

示例:如果程序的输入是:

19

函数draw_triangle()输出:

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

注意:当基数长度为19时,最后一行第一个*前不输出空格

我已经能够弄清楚递归部分,但我不知道如何在三角形的左侧获得正确的空白

如果我没理解错的话,你应该看到"top"三角形中总是有一个*。如果三角形的底为n,则"顶"行中应该有n - 1个空格

继续这个模式,你可以看到在顶部下的每一行,你都加了2 *。如果r是行(从顶部开始,r = 0),则任何给定的行将有n - 2r - 1个空格。

这是最酷的部分,因为你知道n是奇数(问题中给定的)而2r肯定是偶数,那么n - 2r - 1总是偶数。将这个数字的一半称为"空白量"。并打印出每行的空格量(记住,行r从0开始)。

下面是一些伪代码

def print_triangle(width, row):
if 2 * row + 1 == width: # if you are in the last row
for i < 2 * row + 1:
print("*") # print the *
return # break out of recursion
else:
for i < (width - 2 * row - 1) / 2:
print(" ") # print whitespace
for i < 2 * row + 1:
print("*") # print the *
return print_triangle(width, row + 1) # recursive call
当然,还有很多方法可以做到这一点,其中一些方法的代码会更简洁,但希望这些伪代码可以帮助您理解程序背后的逻辑。

你不能只有一个变量来递归:
下面的代码可以帮助你:

def draw_triangle(n,i):
if(n<=0):
return 
print(" "*(n//2),end="")
print("*"*i)
draw_triangle(n-2,i+2)
draw_triangle(19,1)

输出:

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

希望这对你有帮助。这里i=1,因为您需要在开头打印1 *。

对于你奇怪的要求有9个空格的所有输入:))

def draw_triangle(n,i=1,s=9):
if(i>n):
return 
print(" "*s+"*"*i)
draw_triangle(n,i+2,s-1)
draw_triangle(3)

这里i代表第一行星星的数量,s代表第一行空间。


输出:
*
***

最新更新