簡體   English   中英

F#遞歸函數,使用match創建斐波那契序列

[英]F# Recursive function using match to create a Fibonacci sequence

我試圖做一個利用匹配來創建斐波那契數列的遞歸函數。 我讓Euler2工作,但是在Euler2a中,我試圖使整個函數自成一體,除了迭代約束j。

Euler2a必須如何更改才能提供序列?

任何指針是最贊賞的。 :)

Euler2的結果

val Euler2:list:int列表-> i:int-> j:int-> int列表

val z:int列表= [1; 2; 3; 5; 8; 13; 21; 34; 55; 89]

Euler2a的結果

val Euler2a:j:int->(int列表-> int-> int-> int列表)

val z2 :(整數列表->整數->整數->整數列表)

歐拉2

let rec Euler2 (list: int list) i j =
    match i with
    | 1 | 2         ->  Euler2 list (i+1) j
    | _ when (i<=j) ->  let newList = list @ [list.[list.Length - 1] + list.[list.Length - 2]]
                        Euler2 newList (i+1) j
    | _             ->  list

let z = Euler2 [1;2] 1 10

歐拉2

let rec Euler2a (j:int) =
    let i = 1
    let list = [1;2]
    let rec Euler2b (list: int list) i j =
        match i with
        | 1 | 2         ->  Euler2b list (i+1) j
        | _ when (i<=j) ->  let newList = list @ [list.[list.Length - 1] + list.[list.Length - 2]]
                            Euler2b newList (i+1) j
        | _             ->  list
    Euler2b

let z2 = Euler2a 10

您的Euler2a返回值Euler2b ,該值是一個帶有列表和2個整數參數的函數。 您實際上需要通過更改以下行來提供參數

Euler2b

Euler2b list i j

以便將參數提供給函數。 然后一切正常。

除了與遞歸調用內部函數的格式眼前的問題Euler2b從身體Euler2a約翰的回答地址有相關的辦法采取不太明顯的問題。

  • 您的實現使用F#列表作為基礎數據結構。 盡管它可以解決Project Euler問題2 ,但與慣用的F#列表相比,它更像是數組使用。 表達式list @ [list.[list.Length - 1] + list.[list.Length - 2]]不僅由於使用索引器list.[i]計算量很大,而且由於追加操作符@計算量也很大,這完全浪費了每次迭代的最新列表,並重新創建新的列表(長一個元素),從而對垃圾回收產生不必要的壓力。 列表的慣用F#用法將其從左開始增加,然后在最后一步反轉,如下所示:

     let euler2c len = let rec inner (list: int list) i len = match list with | l::p::tail when (i < len) -> inner ((l + p)::l::p::tail) (i+1) len | _ -> List.rev list inner [2;1] 2 len 
  • 具有一定長度的斐波那契數列對於解決原始問題不方便,因為解決方案應基於最后一個元素的值,這可能需要額外的參數/條件。 listF#序列的更多慣用法將是懶惰地表示任意長度的斐波那契序列。 使用庫函數Seq.unfold可以實現以下簡潔的襯里實現:

     let fibnums = Seq.unfold (fun(curr,next) -> Some(curr,(next,curr+next)))(1,2) 

    現在,可以使用庫函數和組合器來慣用類型為seq<int> fibnums 特別是,使最后一個元素不超過4000000的序列可以表示為fibs |> Seq.takeWhile ((>=) 4000000)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM