2009-11-16 64 views
1

嗨,有沒有人知道我該怎麼做pascal第n行 當我要求 :?帕斯卡(2,行)。 我得到行= [1,2,1] ??prolog pascal triangle

請幫我

+0

沒有我需要它來確定整個三角形不僅是一排 – thisnotmyname 2009-11-17 00:47:47

+0

第二行是[1,1],而不是[1,2,1],這是第三行。 – 2009-11-18 04:47:21

回答

1

這裏是計算第n行的代碼。

第一部分掃描一行,計算下一行。第一行必須以0作爲前綴,以便下一行中的第一個「1」是一個總和,就像其他元素一樣。它在2個列表上遞歸:

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(0, [1]) :- !. 
pascal(N, R) :- 
    N1 is N-1, 
    pascal(N1, R1), 
    pascal_next_row([0|R1], R). 

如果您需要完整的三角形,所有你需要做的是改變第二個參數來處理行的列表,並收集他們:

pascal(0, [[1]]) :- !. 
pascal(N, [R, R1 | RN]) :- 
    N1 is N-1, 
    pascal(N1, [R1 | RN]), 
    pascal_next_row([0|R1], R). 
1

This answer to a code golf有在序言中實現,只是擴展名:

+0

有趣的鏈接,謝謝。我將我的實現複製到代碼高爾夫球上,隨時重新開始比賽:-) – Jerome 2009-11-17 10:15:29

0

帕斯卡三角也被稱爲塔爾塔利亞三角:

sumC([X,Y],[Z]) :- Z is X + Y. 
sumC([X,Y|L], Z):- H is X + Y, 
        sumC([Y|L],L2), 
        Z = [H|L2]. 

tartaglia(1,[1]) :- ! . 
tartaglia(2,[1,1]) :- !. 
tartaglia(N, L) :- Ant is N - 1, 
        tartaglia(Ant,L2), 
        sumC(L2,R), 
        append([1|R],[1],L), !. 

使用的輔助謂詞sumC,你可以很容易:

?- tartaglia(3,R). 
R = [1, 2, 1]. 

?- tartaglia(2,R). 
R = [1, 1]. 

?- tartaglia(1,R). 
R = [1]. 

?- tartaglia(6,R). 
R = [1, 5, 10, 10, 5, 1]. 

正如我在評論說。你問第n行。你例子中的[1,2,1]是第三行。