是否可以计算f#中负数的连续分数?

问题描述

我正在尝试制作一个可以计算实数的分数的程序。 除非我要为负实数(例如“ -71/23”或小数点“ -3,086 ...”)进行处理,否则它完全可以正常工作。

如果我计算+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)

printfn“%A”(float2cfrac(-71.0 / 23.0))

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

编辑:经过大量工作,我现在找到了解决方案:D只需添加一条额外的代码,说如果x为负数,则-q代替q :) 另请参阅下面我已接受作为答案的评论,您需要更改并添加一些功能:)

  | _ when 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 )

来自fsi:

> float2cfrac (71./23.);;                                                                                                                    
  val it : int list = [3; 11; 2]                                                                                                                                                                                                                  
> float2cfrac (-71./23.);;                                                                                                                    
  val it : int list = [-3; -11; -2]                                                                                                                           
,

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...