微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决是否可以计算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有什么方法可以做到? 已解决

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?