Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Recursion 实现将实数转换为#F中的连分数的算法_Recursion_F#_Continued Fractions - Fatal编程技术网

Recursion 实现将实数转换为#F中的连分数的算法

Recursion 实现将实数转换为#F中的连分数的算法,recursion,f#,continued-fractions,Recursion,F#,Continued Fractions,我正在尝试实现一个递归函数,它接受一个float并返回一个int列表,表示float()的连分数表示形式。一般来说,我认为我理解算法应该如何工作。这相当简单。到目前为止,我得到的是: let rec float2cfrac (x : float) : int list = let q = int x let r = x - (float q) if r = 0.0 then [] else q :: (float2cfrac

我正在尝试实现一个递归函数,它接受一个float并返回一个int列表,表示float()的连分数表示形式。一般来说,我认为我理解算法应该如何工作。这相当简单。到目前为止,我得到的是:

let rec float2cfrac (x : float) : int list = 
    let q = int x
    let r = x - (float q)
    if r = 0.0 then
         []
    else 
         q :: (float2cfrac (1.0 / r ))
问题显然在于基本情况。似乎值r从未减少到0.0,相反,算法继续返回类似于0.0…[数字]的值。我只是不知道如何进行比较。我该怎么做呢。函数所基于的算法表示基本情况为0,因此我自然将其解释为0.0。我看没有别的办法了。另外,请注意,这是一个任务,其中明确要求我递归实现算法。有人给我一些指导吗?非常感谢

似乎值r从未减少到0.0,相反,算法继续返回类似于0.0…[数字]的值

这是浮点比较的经典问题。您需要使用一些ε公差值进行比较,因为
r
永远不会精确达到
0.0

let epsilon = 0.0000000001
let rec float2cfrac (x : float) : int list =
  let q = int x
  let r = x - (float q)
  if r < epsilon then
    []
  else 
    q :: (float2cfrac (1.0 / r))

> float2cfrac 4.23
val it : int list = [4; 4; 2; 1]
let withinTolerance (x: float) (y: float) e =
  System.Math.Abs(x - y) < e
let float2cfrac (x: float) =
  let q = int x
  let r = x - (float q)
  if withinTolerance r 0.0 epsilon then None
  else Some (q, (1.0 / r))

4.23 |> Seq.unfold float2cfrac // seq [4; 4; 2; 1]