停止這個函數遞歸的更方便的方法是什麼?目前我使用嵌套的if/else,如果下一個組合「溢出」,則返回一個空列表。在這個函數中的習慣性哈斯克爾終止遞歸方式
nextcomb [] [] = []
nextcomb lst maxes | length lst == length maxes =
let lastel = last lst
in if lastel < last maxes
then (init lst) ++ [lastel+1]
else let higherbit = (nextcomb (init lst) (init maxes))
in if higherbit == []
then []
else higherbit ++ [1]
nextcomb lst maxes | otherwise = []
爲了澄清,它的作用是它需要像[1,1,1,1]和增量它喜歡數字的列表:
[1,1,1,1] - > [1,1,1,2]
...
[1,1,1,9] - > [1,1,2,1]
...
[1,1,9,9] - > [1,2,1,1]
等
但是,第二個參數是一個列表,指示每列的最大值。因此,如果是馬克塞斯[2,3],和初始列表是[1,1],則進展woudld是:
[1,1] - >並[1,2]
[1 ,2] - > [1,3]
[1,3] - >並[2,1]
[2,1] - > [2,2]
[2,2 ] - > [2,3]
[2,3] - > []
編輯:「小端」版本所推薦的chepner
nextcomb' [] [] = []
nextcomb' lst maxes | length lst /= length maxes = []
nextcomb' lst maxes =
let firstel = head lst
in if firstel < head maxes
then (firstel+1) : (tail lst)
else let higherbit = (nextcomb' (tail lst) (tail maxes))
in if higherbit == []
then []
else 1 : higherbit
請注意,使用顛倒的「低端」列表可能更容易,只能將它們顯示爲「big-endian」。 – chepner
注意到,好抓。謝謝。 –
爲什麼在最後一個例子中,最後一個數字不能是4,但第一個數字可以是2? – zakyggaps