可以计算f#中负数的连分数吗?

可以计算f#中负数的连分数吗?,f#,fractions,continued-fractions,F#,Fractions,Continued Fractions,我想做一个程序,可以计算出实数的计算分数。 它工作得非常好,除非我尝试对负实数,比如“-71/23”或小数“-3086…”进行运算 如果我计算+71/23的连分数,我得到[3;11;2]。这是正确的。据我所知,如果我尝试在-71/23中使用它,我应该会得到相同的int列表,但是第一个元素是负数(使用钢笔和纸)。所以应该是[-3;11;2]。 但它不起作用。我得到[-3;-11;-1;-1],它是每个负数加上一个额外的负数 我想我需要做一个分支,在这里我告诉函数,只有int列表的第一个数字是负的,

我想做一个程序,可以计算出实数的计算分数。 它工作得非常好,除非我尝试对负实数,比如“-71/23”或小数“-3086…”进行运算

如果我计算+71/23的连分数,我得到[3;11;2]。这是正确的。据我所知,如果我尝试在-71/23中使用它,我应该会得到相同的int列表,但是第一个元素是负数(使用钢笔和纸)。所以应该是[-3;11;2]。 但它不起作用。我得到[-3;-11;-1;-1],它是每个负数加上一个额外的负数

我想我需要做一个分支,在这里我告诉函数,只有int列表的第一个数字是负的,其余的应该返回正的。 我尝试过不同的东西,但我不知道如何解决

顺便说一下,这是家庭作业

提前感谢,, 斑马线

let rec float2cfrac (x : float) : int list =
    let q = int x
    let r = x - (float q)
    match x with 
    | _ when r < 0.000000001 && r > -0.000000001 -> [q]
    | _ when System.Math.Ceiling(x) - x <0.0001 -> [int (x + 1.0)]
    | _ when q < 0 -> [-q] // this is the line where I want to do it, not sure what to do tho 
    | _ -> q :: float2cfrac (1.0 / r)
让rec float2cfrac(x:float):int list=
设q=intx
设r=x-(浮点数q)
将x与
|_uu当r<0.000000001&&r>-0.000000001->[q]
|_uu当系统数学上限(x)-x[int(x+1.0)]
|_uq<0->[-q]//这是我想做的行,不知道该做什么
|_u->q::float2cfrac(1.0/r)
打印fn“%A”(浮动2CFRAC(-71.0/23.0))

编辑:移动带有注释的代码并更改代码格式

编辑:经过大量的工作,我现在已经找到了解决方案:D只需添加一行额外的内容,说明如果x为负,那么-q而不是q:) 另请参见下面的评论,我已接受该评论作为答案,您需要更改并添加一些函数:)

当x<0.0->-q::float2cfrac(1.0/r)时
我只取绝对值,然后在末尾加上符号:

let rec float2cfrac (x : float) : int list =
  let safeX = abs x
  let signX = sign x
  let q = int safeX
  let r = safeX - (float q)
  match x with 
  | _ when r < 0.000000001 && r > -0.000000001 -> [q]
  | _ when System.Math.Ceiling(safeX) - safeX <0.0001 -> [int (safeX + 1.0)]
  | _ -> q :: float2cfrac (1.0 / r)
  |> List.map ( fun rawQ -> rawQ * signX )

上面的代码计算正确,但我认为问题是函数必须得到这个输出[-3;11;2],所以只有第一个数字是负数:D有什么方法可以做到吗已解决

能否修复代码示例的格式?这是F#所以缩进很重要。另外,match语句的第三种情况是一个包罗万象的情况,因此第四种情况将永远不会被评估。非常感谢您的输入。我想我现在已经修复了代码示例,并将代码移到了第四条语句上方。仍然没有修复。我认为这可能与系统、数学、天花板(x)有关。如果它是一个正数,它会四舍五入,但是如果它是一个负数,它只是删除小数(例如:3,5将是4,-3,5将是3)。当q为负或类似时,我可能不得不让它表现得不同,不确定,非常感谢您的输入!这真的很有帮助,帮助我走上正轨。然而,据我所知,只有第一个数字可能是负数。这是因为如果你手工计算-71/23的连分数,你会得到[-3;11;2]。因此,[-3;-11;-2]我认为是不正确的。所以我认为,为了让这个完全成功,我需要使程序只允许输出int列表中的第一个元素为负数,或者alikeI已经接受了这个答案,因为您在寻找解决方案的过程中帮助了我。最终的解决方案已添加到帖子中。非常感谢,我很感激!很高兴我能提供帮助,很抱歉我误解了连续分数应该如何工作。
let rec float2cfrac (x : float) : int list =
  let safeX = abs x
  let signX = sign x
  let q = int safeX
  let r = safeX - (float q)
  match x with 
  | _ when r < 0.000000001 && r > -0.000000001 -> [q]
  | _ when System.Math.Ceiling(safeX) - safeX <0.0001 -> [int (safeX + 1.0)]
  | _ -> q :: float2cfrac (1.0 / r)
  |> List.map ( fun rawQ -> rawQ * signX )
> float2cfrac (71./23.);;                                                                                                                    
  val it : int list = [3; 11; 2]                                                                                                                                                                                                                  
> float2cfrac (-71./23.);;                                                                                                                    
  val it : int list = [-3; -11; -2]