2011-04-11 77 views
2

嗨 Im新的Haskell,並希望編寫一個簡單的代碼。 我想寫一個函數來創建一個數字列表。 在那裏它與1開始的,並用2N增加+ 1個N + 1 所以例如輸出應該像 取6 myList中= [1,3,4,7,9,10]Haskell創建號碼列表

我想我需要使用遞歸,但不知道如何以列表格式執行 。

任何幫助將不勝感激。謝謝

+1

您的示例將所有輸出排序,這會創建奇數交錯模式。你是否需要對它們進行排序(無限 - 就是說,如果你只想要有限的許多,你可以隨時排序)?關於重複的東西呢?即如果某個數字可以寫成2n + 1和3m + 1,其中n和m是列表的元素,它應該出現兩次嗎? – luqui 2011-04-11 05:18:13

回答

6

其實,我不知道我是否有你的想法。 但這是你想要的嗎?

generator list = list ++ generator next 
    where 
    next = (map (\n -> 2 * n + 1) list) ++ (map (\n -> 3 * n + 1) list) 

哦,你可以用generator [1]來啓動。像這樣:

take 100 $ generator [1] 
+0

+1哇,優雅的解決方案。我正在尋找優先級隊列和東西。 – luqui 2011-04-11 05:24:49

+0

這是有點欺騙性,因爲它是「更多排序」,但仍未排序或結尾。 – 2011-04-11 14:33:53

1
merge xs [] = xs 
merge [] ys = ys 
merge (x:xs) (y:ys) | x == y = x : merge xs ys 
        | x < y = x : merge xs (y:ys) 
        | otherwise = y : merge (x:xs) ys 

print $ take 10 $ merge [1,3..] [1,4..] 
--[1,3,4,5,7,9,10,11,13,15] 
+0

這似乎是錯的,他說前幾項是[1,3,4,7,9,10]。但你的產品[1,3,4,5,7,9,10]。 – 2011-04-11 07:21:31

+0

但是5的形式是2n + 1,不是嗎?或者我誤解了這個問題? – Landei 2011-04-11 09:55:44

+0

我認爲'n'必須是'2n + 1'列表的前面部分纔是有效的。 – 2011-04-11 14:54:58

1

正如luqui說,我們可以使用信息,如做重複的事,並不會爲了物質。如果答案是否定的,並沒有那麼簡單concatMap正常工作:

myList = 1 : concatMap (\n -> 2*n+1 : 3*n+1 : []) myList 

結果:

> take 20 myList 
[1,3,4,7,10,9,13,15,22,21,31,19,28,27,40,31,46,45,67,43] 

如果答案是肯定的,是的話,我想這可能是更清潔,但是這已經足夠:

myList = abs 
    where 
    abs = merge as bs 
    as = 1 : map (\n -> 2*n+1) abs 
    bs = 1 : map (\n -> 3*n+1) abs 
    merge (x:xs) (y:ys) 
     | x == y = x : merge xs ys 
     | x < y = x : merge xs (y:ys) 
     | otherwise = y : merge (x:xs) ys 

結果:

> take 20 myList 
[1,3,4,7,9,10,13,15,19,21,22,27,28,31,39,40,43,45,46,55]