2011-11-03 109 views
1

我的工作很簡單的事情了一下午,但似乎無法得到它的權利出於某些原因:如何把一個列表轉換成一定寬度的矩陣。打開列表到矩陣

實施例: 我有一個列表,諸如

[1, 3, 5, 7, 6, 8, 9, 0] 

,並希望通過謂詞

list2matrix/3 : list2matrix(List, Size_of_Rows, Matrix). 

在本實施例中使用象創建矩陣如

[[1, 3], 
[5, 7], 
[6, 8], 
[9, 0]] 

如果列表的長度不是行的大小的倍數
list2matrix([1, 3, 5, 7, 6, 8, 9, 0], 2, Matrix). 

謂語應該失敗。通過提前(

感謝,如果你能提出關於如何處理任何線索;

我決定不發表我的工作,因爲我覺得我得到它錯了,它不會幫助我得到它修正這意味着對數字這樣的問題。

+2

您的問題聲明是不完整的。 'list2matrix([1,3,5],2,Matrix)'成功還是失敗?如果成功,應放棄或延伸到[5,_]或任何其他價值。 – false

+0

讓我們說它會失敗,謝謝指出。因爲我打算在方形列表上使用它,所以我沒有精確;( – m09

回答

2

可以分爲兩個部分劃分的問題。 第一個構建塊將構建一排N個元素。那就是將輸入列表分成兩個列表,其中一個將具有N個元素(行),另一個是輸入列表的剩餘部分。

第二積木將建立,其由行的矩陣。

list_to_matrix([], _, []). 
list_to_matrix(List, Size, [Row|Matrix]):- 
    list_to_matrix_row(List, Size, Row, Tail), 
    list_to_matrix(Tail, Size, Matrix). 

list_to_matrix_row(Tail, 0, [], Tail). 
list_to_matrix_row([Item|List], Size, [Item|Row], Tail):- 
    NSize is Size-1, 
    list_to_matrix_row(List, NSize, Row, Tail). 
+0

非常感謝您的回答,我正在努力瞭解它,並且很快就會對其進行測試,之後我會對其進行評論:) – m09

+0

好的,我閱讀並且很容易理解,儘管我仍然認爲我會我很難找到自己的解決方案:( 我只是補充說: - !。在每次第一次選擇後削減回溯,以確定性,現在我有我想要的東西,非常感謝你:) – m09

+3

你的'list_to_matrix_row'可以簡化爲'list_to_matrix_row(L,RowLen,Row,Rest): - 長度(Row,RowLen),追加(Row,Rest,L)。「 –

1

查找在期望的結果的圖形。 將被分配爲在每對的和非對將在第一地點每次所述第二數量。 創建雙維陣列和分配的非對位置索引子「一」和 成對「b」。

正如你所看到的「我」是一個數組的索引,一個多維數組。 I [A] [B]

用戶需要通過兩個陣列中爲了做到這一點進行迭代。

希望它有幫助。

+0

這樣做時遇到的問題是對於矩陣的寬度爲2,但對於任何數字而不是2都是正確的。在我的我特別感興趣的是將列表長度爲81的列表轉換爲9 * 9矩陣。我希望得到的謂詞是大小硬編碼免費的,但如果9必須硬編碼,那麼它是可以的! – m09

2

順便說一句,我想我會提到我終於寫的代碼:

length_(Length, List) :- length(List, Length). 

list2matrix(List, RowSize, Matrix) :- 
    length(List, L), 
    HowManyRows is L div RowSize, 
    length(Matrix, HowManyRows), 
    maplist(length_(RowSize), Matrix), 
    append(Matrix, List). 

它更高階導向,有趣閱讀我猜:)

+1

有趣!使用['library(lambda)'](http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/lambda.pl),您可以編寫'maplist({RowSize} + \ Xs^length(Xs ,RowSize),Matrix)'而不是使用輔助定義。見[本簡介](http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/ISO-Hord)。 – false

+0

不錯,謝謝你的建議+鏈接:) – m09