撰寫一個名為 draw_triangle() 的遞回函式,它輸出 * 的線以形成一個右側向上的等腰三角形。函式 draw_triangle() 有一個引數,一個表示三角形底邊長度的整數。假設基本長度總是奇數且小于 20。在第一行的第一個 '*' 之前輸出 9 個空格以進行正確的格式設定。
提示:每畫一條線,“*”的數量就增加 2。
例如:如果程式的輸入是:3,
然后函式 draw_triangle 輸出:
*
***
如果程式的輸入是19,
然后函式輸出
*
***
*****
*******
*********
***********
*************
***************
*****************
*******************
當基本長度為 19 時,在最后一行的第一個星號之前不輸出空格。
我能夠以非遞回方式對此進行編碼,如下所示:
def draw_triangle(n):
lines_to_print = int(((n // 2) 1))
spaces_to_print = 9
asts_to_print = 1
for i in range(lines_to_print):
print(spaces_to_print * ' ', end='')
print(asts_to_print * '*', end='')
print()
spaces_to_print -= 1
asts_to_print = 2
base_length = int(input())
draw_triangle(base_length)
但是,我一生都無法弄清楚如何遞回地做到這一點,更不用說只有一個論點了。我對遞回缺少什么?
uj5u.com熱心網友回復:
一種方法是定義函式來列印您要使用的符號以及它們之間的空格:
def print_ecart(ecart):
if (ecart == 0):
return;
print(" ", end = "")
print_ecart(ecart - 1)
def print_etoile(etoile):
if(etoile == 0):
return
print("* ", end = "")
print_etoile(etoile - 1)
def pattern(n, num):
if (n == 0):
return
print_ecart(n - 1)
print_etoile(num - n 1)
print("");
pattern(n - 1, num)
在這種情況下print_ecrat列印空格并print_etoile列印星星:
pattern(10,10)
回傳:
*
* *
* * *
* * * *
* * * * *
* * * * * *
* * * * * * *
* * * * * * * *
* * * * * * * * *
* * * * * * * * * *
uj5u.com熱心網友回復:
通過在遞回本身發生后列印,您可以在較大的行上列印較小的行:
def draw_triangle(n):
spaces = 9 - n // 2 # Ensures correct spacing for each line
if n == 1:
print(spaces * ' ' '*')
else:
draw_triangle(n-2)
print(spaces * ' ' n * '*')
draw_triangle(19)
uj5u.com熱心網友回復:
嗯,這是一個非常有趣的問題。主要障礙是您必須保留三角形的初始底邊長度。您不能通過將輸入值分配給遞回函式內的另一個引數來保存它,因為:
- 只允許一個引數
- 分配將在每個函式呼叫中起作用。
不確定以下代碼是否方便任務的條件,但它可能對您說明遞回函式的想法很有用:
base_length = 20
def draw_triangle(base=base_length):
if base % 2 == 0:
base = base - 1
draw_triangle(base)
else:
if base > 0:
# print(base)
# print(int(base/2 - 1))
print(' '*int((base - 2)/2 1) '*'*(base_length - base) ' '*int((base - 2)/2))
base = base - 2
draw_triangle(base)
elif base == 0:
return 0
draw_triangle(base=base_length)
形式上,這個遞回函式只有一個引數,但你必須base_length在函式外部定義引數,函式base_length在內部使用。
uj5u.com熱心網友回復:
這里的簡單技巧是使用str.center()方法。
def draw_triangle(n):
if n == 1:
print('*'.center(19))
else:
draw_triangle(n-2)
print((n*'*').center(19))
測驗它:
draw_triangle(19)
*
***
*****
*******
*********
***********
*************
***************
*****************
*******************
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/470924.html
下一篇:使用遞回去除二叉搜索樹
