2009-11-15 54 views
1

我寫了一個函數帕斯卡三角下一行返回給定當前行:帕斯卡在序言三角

pascal_next_row([X],[X]). 
pascal_next_row([H,H2|T],[A|B]):- 
    pascal_next_row([H2|T],B), 
    A is H + H2. 

我希望能夠找到在三角形,例如第n行pascal(5,Row)Row=[1,5,1,0,1,0,5,1]。我有這樣的:

pascal(N,Row):- 
pascalA(N,[1,0],Row). 

pascalA(N,R,_Row):- 
N > 0, 
M is N-1, 
    next_row([0|R],NR), 
    pascalA(M,NR,NR). 

顯然應該是最後一個n==0發現之前。我該如何回報它?我嘗試使用is關鍵字,即Row is NR,但這是不允許的,在平面上。任何幫助?


試圖在列表使用is打動了我:

! Domain error in argument 2 of is/2 
! expected expression, but found [1,4,6,4,1,0] 
! goal: _23592586 is[1,4,6,4,1,0] 

回答

0

執行基本情況,N > 0取消你的計算.. 。

pascalA(N,R,_Row):- 
N > 0, %% this evaluates to false so the calculation gets canceled 
M is N-1, 
    next_row([0|R],NR), 
    pascalA(M,NR,NR). 

pascalA(0,R,R). %% this should be the base case... hope I got it correct... 

pascalA(N,R,_Row):- 
M is N-1, 
    next_row([0|R],NR), 
    pascalA(M,NR,_Row). 
+0

我似乎無法在列表中使用'is'函數。我正在使用SICStus,並且出現錯誤 '!參數2中的域錯誤是/ 2 !預期表達,但發現[1,4,6,4,1,0] !目標:_23592586是[1,4,6,4,1,0]' – blork 2009-11-15 15:35:25

+0

哦對不起...我忘了它是一個列表...我從內存中寫這個東西(閱讀:沒有測試).. 。我認爲用'='代替'is'可能會起作用... – Egon 2009-11-15 19:24:45

+0

只是使用'pascalA(0,R,R).'應該可以... – Egon 2009-11-15 19:26:28

0

您需要pascalA基本情況,其中N = 0