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]
推荐阅读
- java - 尝试以编程方式重用具有细微差异的布局
- ruby-on-rails - 当管理员按下提交时如何将表值设置为 true
- php - 将 Json 输出转换为 UTF8
- git - 如何在推送中获取最新的提交消息并验证消息以某种正则表达式模式开头?
- mysql - 用户能否编写复杂的查询,只能访问视图?
- python - 索引错误:Python
- c# - Join tables from different databases (ADO.NET)
- java - Why my PrintWriter is not sending data to server?
- php - What does this line of code mean in PHP? h(u($_GET[]))
- r - How does caret calculate sensitivity and specificity in resamples?