2013-10-02 27 views
1

我有一些OCaml代碼,可以根據給定的更改量查找所有更改的組合。我有大部分的代碼工作,但我無法弄清楚這個遞歸函數如何實際返回可能的更改組合。查找OCaml中的所有更改組合(貨幣)

let change_combos presidents = 
    let rec change amount coinlist = match amount with 
    |0 -> [[]] (*exits when nothing*) 
    |_ when (amount < 0) -> [] (*exits when less than 0*) 
    |_ -> match coinlist with 
    |[] -> [] (*Returns empty list, exits program*) 

(*h::f -> something, using [25;10;5;1] aka all change combinations...*) 
(*using recursion, going through all combinations and joining lists returned together*) 

let print_the_coin_matrix_for_all_our_joy enter_the_matrix = 
print_endline (join "\n" (List.map array_to_string enter_the_matrix));; 

感謝您的幫助,讓我知道如果我需要澄清的東西:)

+2

這段代碼太不完整,不太多說。我認爲你所要求的一般答案是函數是由表達式定義的(有值的東西)。該值是該函數返回的值。但這可能沒有幫助:-)也許你可以問一些更具體的東西。 –

+0

所以我想我應該可以這樣做我的連接: let join concat all_my_lists = List.fold_left(fun x y - > x^concat^y)「」all_my_lists ;; let array_to_string array = join「,」(List.map string_of_int array);; 但不知道如何實際調用遞歸函數來返回「更改」的所有組合... 希望這使得它更清晰一點。 – Airborne

+1

有點建議,當你用'結構'嵌套'match ...時,使用括號。 –

回答

1

這是一個有點混亂,你在找什麼。我相信你想要生成一個列表的所有組合列表?您應該考慮遞歸以及如何生成單個元素。從輸入類型開始,以及如何通過減少問題空間來生成連續的元素。

let rec generate lst = match lst with 
    | [] -> [] 
    | h::t -> [h] :: (List.map (fun x -> h::x) (generate t)) @ (generate t) 

如果列表是[]沒有組合。如果我們有一個元素,我們就會生成所有沒有這個元素的組合,並以此假設爲基礎進行構建在這一點上,組件就位。將t的組合列表與thcons'的組合的列表連接起來,並將h的單例組合。