如何創建一個函數,它懶洋洋地使排列的字符「_」和「*」這樣的:哈斯克爾 - 如何生成排列
例如:
Main> function 3
["___","*__","_*_","__*","**_","_**","*_*","***"]
第一個元素是由僅從_
開始,接下來的3個列表是:*__
,第二個3列出了**_
,最後一個元素僅包含*
。
我該怎麼做?
如何創建一個函數,它懶洋洋地使排列的字符「_」和「*」這樣的:哈斯克爾 - 如何生成排列
例如:
Main> function 3
["___","*__","_*_","__*","**_","_**","*_*","***"]
第一個元素是由僅從_
開始,接下來的3個列表是:*__
,第二個3列出了**_
,最後一個元素僅包含*
。
我該怎麼做?
「正確順序」的版本:
import Data.List
function k = concatMap (nub . permutations . pat) [0..k]
where pat x = replicate x '*' ++ replicate (k-x) '_'
我不知道如何從一個置換步驟到另一個在固定時間內,雖然。
這裏還有一個 「正確的順序」 的版本:
function :: Int -> [String]
function c = concatMap helper $ zip (reverse [0..c]) [0..c]
helper :: (Int, Int) -> [String]
helper (c, 0) = [replicate c '_']
helper (0, c) = [replicate c '*']
helper (cUnderscores, cAsterisks) = map ('_' :) (helper (cUnderscores - 1, cAsterisks))
++ map ('*' :) (helper (cUnderscores, cAsterisks - 1))
你可能想看看replicateM
。
雖然正確,但這並不是很有幫助,甚至作爲一個提示。大多數人不會得到這個把戲,除非你第一次爲他們拼出來。至少要提到它需要特定的monad列表。 –
@GabrielGonzalez我不想把它完全拼出來,因爲實際的完整答案已經被刪除。 –
這功課嗎?你有什麼嘗試? – is7s
這不應該被稱爲「排列」 – newacct
@ rotskoff:排列意味着您可以訂購3個球的方式的數量。 3個球的排列數是6.你所問的是完全不相關的。你並不總是選擇3 *(有時你選擇0,1或2)。而且你也沒有區分不同的*(這意味着沒有秩序;這是排列的本質)。 – newacct