[英]Generating the Fibonacci Sequence in Matlab using recursive function NOT using any loop
[英]F# Recursive function using match to create a Fibonacci sequence
我試圖做一個利用匹配來創建斐波那契數列的遞歸函數。 我讓Euler2工作,但是在Euler2a中,我試圖使整個函數自成一體,除了迭代約束j。
Euler2a必須如何更改才能提供序列?
任何指針是最贊賞的。 :)
val Euler2:list:int列表-> i:int-> j:int-> int列表
val z:int列表= [1; 2; 3; 5; 8; 13; 21; 34; 55; 89]
val Euler2a:j:int->(int列表-> int-> int-> int列表)
val z2 :(整數列表->整數->整數->整數列表)
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
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
具有一定長度的斐波那契數列對於解決原始問題不方便,因為解決方案應基於最后一個元素的值,這可能需要額外的參數/條件。 從list
到F#序列的更多慣用法將是懶惰地表示任意長度的斐波那契序列。 使用庫函數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.