具有连续性问题的F#扩展Euclidian算法

问题描述 投票:0回答:1

我是F#的新手,自从我还是一名本科生以来就没有进行过函数编程,但是我一直在尝试自学。我写了一个朴素的递归扩展欧几里得实现,效果很好,现在可以重试,但要继续。

[我用一个小例子手工遍历了两次代码,并得到了正确的答案,但是当我通过解释器运行它时,我得到的结果并不相同,因此我显然误解了我想做的事情。] >

我手动运行eea 7 3,并且我计算出的(正确)结果是(1,1,-2)

但是当我在解释器中运行它时,会得到

eea 7 3;;
val it : int * int * int = (1, 0, 1)

这是我的实现:

let eea a b = 
    let rec contEEA a b f = 
        match b with
        | 0 -> f () (a,1,0)
        | _ -> 
            contEEA b (a%b) (fun () t ->
                let (d,x',y') = t
                (d, y', x'-(y'*(a/b)))
            )
    contEEA a b (fun () t -> t)

作为参考,天真的方法直接来自教科书,是

let rec eea_gcd a b =
    match b with
    | 0 -> (a, 1, 0)
    | _ -> 
        let d, x', y' = eea_gcd b (a % b)
        (d, y', x'-(y'*(a/b)))

我是F#的新手,自从我还是一名本科生以来就没有进行过函数编程,但是我一直在尝试自学。我写了一个朴素的递归扩展欧几里得实现,它只适用于...

functional-programming f# continuations
1个回答
1
投票

您基于延续的版本始终只进行一次迭代(最后一次)。当您进行递归调用时,您的延续将直接向上返回结果,而不是通过传递到上一个延续来将其“返回”到上一个调用。

© www.soinside.com 2019 - 2024. All rights reserved.