2010-11-10 101 views
2

我目前正在做一項家庭作業任務,以Python生成所謂的Pascal's triangle格式化Pascal三角形

到目前爲止,這是我所:

def mytri(myrange): 
    trianglevar = [[1]] 
    for i in range(1, myrange): 
     tempvar = [1] 
     for n in range(0, i-1): 
      tempvar.append(trianglevar[i-1][n]+trianglevar[i-1][n+1]) 
     tempvar.append(1) 
     trianglevar.append(tempvar) 
    return trianglevar 

def mymenu(): 
    for i in mytri(int(raw_input("Please enter the height of the triangle: "))): 
     print i 
    print '\n' 
    choicevar = raw_input("Would you like to create another triangle? (y/n): ") 
    if choicevar == "y": 
     mymenu() 
    else: 
     print "Goodbye." 

mymenu() 

什麼程序呢到這一點是執行計算爲三角形。它計算每行中的數字(從1開始),並在達到用戶指定的行數後停止。

但是,我不知道如何格式化我的三角形。目前,它打印爲:

[1] 
[1, 1] 
[1, 2, 1] 
[1, 3, 3, 1] 
[1, 4, 6, 4, 1] 
...etc. 

我想輸出是:

 [1] 
     [1, 1] 
    [1, 2, 1] 
    [1, 3, 3, 1] 
[1, 4, 6, 4, 1] 
...etc. 

(這是一個有點過,由於支架/逗號,但我只是想獲得的一般格式降權現在)。

謝謝你提供的任何幫助!

回答

1
h = int(raw_input("Please enter the height of the triangle: ")) 
for i in mytri(h): 
    print " " * (h * 2), i 
    h -= 1 

所以在這裏您打印2每層金字塔的空間。第一行縮進兩倍高度的空格。正如你血統一個級別,您可以通過2

+0

這是(原始輸入(「請輸入三角形的高度:」))): print i 或者是爲了放置該計劃的其他地方? – 2010-11-10 03:36:55

+0

這假設取代mymenu函數的前兩行。 – cababunga 2010-11-10 03:40:43

1

這裏有一些提示。嘗試:

' ' * someNumber

的間距。如果你不想列表括號,你就可以通過該行循環:

for el in i: 
    # Write el as you want 

或使用join

您可能還會發現enumerate有助於獲取索引(例如間距)。

1

一旦你有你的行,你可能會有最後一行作爲最長。

由於您只是將它們打印出來,您可以採取l = len(str(rows[-1])),然後將其與每行的str(rows[i]).center(l)相結合。

編輯:不知道,我們應該給所有的答案功課......如果是這樣的:

def mytri(myrange): 
    rows = list() 
    lr = None # Last row 

    for i in xrange(myrange+1): 
     try: 
      lr = [1] + [lr[i] + lr[i+1] for i in range(len(lr) - 1)] + [1] 
     except TypeError: 
      lr = [1] 
     #rows.append(str(lr)) 
     rows.append(' '.join(str(v) for v in lr)) 
    return rows 

rows = mytri(10) 
l = len(rows[-1]) 
print '\n'.join(v.center(l) for v in rows) 

將輸出

 
       1     
       1 1     
       1 2 1    
       1 3 3 1    
      1 4 6 4 1    
      1 5 10 10 5 1   
      1 6 15 20 15 6 1   
     1 7 21 35 35 21 7 1   
     1 8 28 56 70 56 28 8 1  
    1 9 36 84 126 126 84 36 9 1  
1 10 45 120 210 252 210 120 45 10 1 
0

減少縮進而不是在每次迭代再生以前行的,你可以得到的每一行,你生成它:

def mytri(height): 
    start = [1] 
    for _ in xrange(height): # "_" for an unused variable 
    yield start # loop written "backwards" for simplicity, 
    # though this does generate one unused row 
    next_row = [1] 
    for a, b in zip(start, start[1:]): # slicing creates a new list, not a 
     next_row.append(a + b)   # concern for this problem, but in 
    next_row.append(1)     # others you could use itertools.islice 
    start = next_row     # to avoid that 

現在向後列舉的高度沿每行:

height = int(raw_input("Height: ")) 
for n, row in zip(xrange(height - 1, -1, -1), mytri(height)): 
    print " " * n, " ".join("%5d" % x for x in row) 

這很快就不會排成很多行,但它應該讓你朝着正確的方向前進。

0

你需要墊所有的數字,使他們具有相同的寬度
你還需要一些填充添加到左側

def mymenu(): 
    res = mytri(int(raw_input("Please enter the height of the triangle: "))) 
    width = len(str(res[-1][len(res[-1])/2])) 
    for i, row in enumerate(res): 
     print " "*(width*(len(res)-i)/2)+" ".join(str(x).rjust(width) for x in row) 
    print '\n' 
    choicevar = raw_input("Would you like to create another triangle? (y/n): ") 
    if choicevar == "y": 
     mymenu() 
    else: 
     print "Goodbye." 

輸出:

Please enter the height of the triangle: 10 
       1 
       1 1 
      1 2 1 
      1 3 3 1 
      1 4 6 4 1 
     1 5 10 10 5 1 
     1 6 15 20 15 6 1 
    1 7 21 35 35 21 7 1 
    1 8 28 56 70 56 28 8 1 
    1 9 36 84 126 126 84 36 9 1 
0
n=input('enter n:') 
z=0 
d=' ' 
while z<n: 
     d=d+' ' 
     z=z+1 
print d,1 
l1=[1] 
l2=[1,1] 
def space(n,a): 
     s='' 
     while a<n: 
     s=s+' ' 
     a=a+1 
     return s 
def digit(n): 
     r=1 
     k=0 
     while r!=0: 
      r=n/10**k 
      k=k+1 
     return k-1 
def print_l(l1,b): 
     d='' 
     d='\n'+space(b-1,0)*3 
     i=0 
     while i<len(l1): 
      d=d+' '*(6-digit(l1[i]))+str(l1[i]) 
      i=i+1 
     print d 
b=n-1 
k=1 
while k<n: 
     l2=l1 
     l1=[1] 
     i=1 
     while len(l1)<len(l2): 
      if i>len(l2)/2: 
       l1.append(l1[len(l2)-i]) 
      else: 
       l1.append(l2[i-1]+l2[i]) 
      i=i+1 
     k=k+1 
     l1.append(1) 
     print_l(l1,b) 
     b=b-1