2016-05-13 304 views
0

我不知道我在做什么错我的代码在这里得到一个递归帕卡尔的三角形在python中工作。任何帮助,恳请赞赏:)递归帕斯卡的三角形(Python)

n = 5 
def printPascal(n): 
    Pascal_List = [] 
    if n == 0: 
     Pascal_List.append([1]) 
     return Pascal_List 
    if n == 1: 
     Pascal_List.append([1]) 
     Pascal_List.append([1,1]) 
     return Pascal_List 


    else: 

     new_row = [1] 
     final_r = printPascal(n - 1) 
     last_row = final_r[-1] 
     for k in range(1, last_row[-1]): 
      new_row.append(final_r[k] + final_r[k - 1]) 

     new_row += last_row 
     final_r.append(new_row) 
     return final_r 

print(printPascal(n)) 
+1

你要问关于* *具体问题,而不是只说“这是我的代码,它不工作,请调试它给我。”。见[help/on-topic] – SiHa

回答

2

你在循环中做了一些混淆,建立一个新的行。 range(1, last_row[-1])真的没有道理;你想迭代最后一行的索引,即range(len(last_row))。您也在下一行混合了final_rlast_row

这里是你的代码的修正版本:

n = 5 

def printPascal(n): 
    Pascal_List = [] 
    if n == 0: 
     Pascal_List.append([1]) 
     return Pascal_List 

    if n == 1: 
     Pascal_List.append([1]) 
     Pascal_List.append([1,1]) 
     return Pascal_List 

    else: 
     new_row = [1] 
     final_r = printPascal(n - 1) 
     last_row = final_r[-1] 
     for k in range(len(last_row)-1): 
      new_row.append(last_row[k] + last_row[k + 1]) 
     new_row.append(1) 

     final_r.append(new_row) 
     return final_r 

print(printPascal(n)) 
+0

谢谢!你是一个传奇:D –

1

有一个更好的方法来做到这一点使用的帕斯卡三角通式(N选K),但我不会去说。

看着你的代码,我猜你正试图添加上一行中的前两个数字来获得下一个数字。在else条件与此

更改替换:

#It should be length instead. 
for k in range(1, len(last_row)): 
    new_row.append(last_row[k] + last_row[k - 1]) 
#You need to add the 1 at the end 
new_row.append(1) 
+0

谢谢:)非常感谢 –

1

@zale已经与您for循环说明了问题,没必要重复。但是请注意,你可以让你的代码很划算简单:

  • 没有必要的n == 1案件特殊处理
  • 您可以通过补零
  • 最后一行使第二部分简单得多

试试这个:

def printPascal(n): 
    if n == 0: 
     return [[1]] 
    else: 
     final_r = printPascal(n - 1) 
     last = [0] + final_r[-1] + [0] # note: this does not modify final_r 
     new_row = [last[k] + last[k - 1] for k in range(1, len(last))] 
     return final_r + [new_row] 
+0

谢谢! :D欣赏它 –