2009-12-16 55 views
3

即時通訊嘗試讓我的手臂圍繞一些基本的序言,但掙扎了一下。在具體 - 即時通訊試圖通過項目列表並將其逐項複製到一個新的列表。我可以把它扭轉,但我發現它在不倒車的情況下做到了。序言,複製列表

我一直嘗試以下 -

copy(L,R) :- accCp(L,R). 

accCp([],R). 
accCp([H|T],R) :- accCp(T,H). 

當我在這個運行跟蹤 - 我可以看到被整個複製的個別項目,但他們得到「丟失」,並且不形成越來越多(在R,因爲我希望)。我怎麼能這樣?

非常感謝

+0

你是否想要copy_term/2具有相同的行爲? – Kaarel 2009-12-26 01:35:47

回答

6

你的基本情況需要設置副本列表空當原來的列表是空的。然後,遞歸情況下需要採取H從列表L並將其添加到列表R的頭:

copy(L,R) :- accCp(L,R). 
accCp([],[]). 
accCp([H|T1],[H|T2]) :- accCp(T1,T2). 

當你調用copy,它工作的方式,以基本情況,在那裏設置R到空的清單。然後,當它恢復工作時,它會繼續將已知列表[H|T1]的頭H附加到變量列表[H|T2]的開頭。它會這樣做,直到達到原始案例,此時R包含L的完整副本。

+0

謝謝,所以如果我正確理解跟蹤 - 它在列表中運行直到accCp([],_)爲真,在這種情況下_被替換爲[],然後當它再次備份時,它確保第二'[]'總是等於第一個?這是邏輯嗎? 非常感謝! – 2009-12-16 02:15:13

+0

是的,這是正確的 - 在遞歸的情況下,它從L獲取H並將其添加到R的頭部。並且由於在基本情況下兩個列表都是相等的(空的),所以當函數是完成。 – 2009-12-16 02:35:57

+0

如果答案還討論瞭如果輸入列表包含變量會發生什麼,這將是很好的,例如,不應該該副本與原始版本無關(與copy_term/2一樣)。另外,如何複製開放列表?測試用例可以是例如「copy([A,B,c,A | X],L)」 – Kaarel 2009-12-26 22:24:32