我是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#的新手,自从我还是一名本科生以来就没有进行过函数编程,但是我一直在尝试自学。我写了一个朴素的递归扩展欧几里得实现,它只适用于...
您基于延续的版本始终只进行一次迭代(最后一次)。当您进行递归调用时,您的延续将直接向上返回结果,而不是通过传递到上一个延续来将其“返回”到上一个调用。