gpt4 book ai didi

recursion - F# 递归地添加多项式

转载 作者:行者123 更新时间:2023-12-03 06:55:26 24 4
gpt4 key购买 nike

我正在尝试用 F# 编写一个函数来递归地添加多项式。我的多项式可以表示为元组列表。

例如,2x^4 + 3x^2 + x + 5 等于 [(2.0,4);(3.0,2);(1.0,1);(5.0,0)]

所有多项式的结构都正确(没有相同次数的重复项,没有零系数的项,除非它是零多项式,按递减指数排序的项,没有空输入列表)。

我在做这件事时遇到了麻烦。这是我的代码

type term = float * int
type poly = term list

let rec atp(t:term,p:poly):poly =
match p with
| [] -> []
| (a, b) :: tail -> if snd t = b then (fst t + a, b) :: [] elif snd t > b then t :: [] else ([]) :: atp(t, tail)
(* val atp : t:term * p:poly -> poly *)

let rec addpolys(p1:poly,p2:poly):poly =
match p1 with
| [] -> []
| (a,b) :: tail -> atp((a,b), p2) @ addpolys(tail, p2)

我有两个多项式

val p2 : poly = [(4.5, 7); (3.0, 4); (10.5, 3); (2.25, 2)]
val p1 : poly = [(3.0, 5); (2.0, 2); (7.0, 1); (1.5, 0)]

当我调用该函数时,我的结果是

val p4 : poly =
[(4.5, 7); (3.0, 5); (3.0, 4); (3.0, 5); (10.5, 3); (3.0, 5); (4.25, 2)]

当正确答案是

  [(4.5, 7); (3.0, 5); (3.0, 4); (10.5, 3); (4.25, 2); (7.0, 1); (1.5, 0)]

最佳答案

不幸的是,您的代码无法编译,因此我很难理解您的意图。但我有一个自己的实现来解决你的问题。也许它会对你有所帮助:

// addpoly:  (float * 'a) list -> (float * 'a) list -> (float * 'a) list
let rec addpoly p1 p2 =
match (p1, p2) with
| [], p2 -> p2
| p1, [] -> p1
| (a1, n1)::p1s, (a2, n2)::p2s ->
if n1 < n2 then (a2, n2) :: addpoly p1 p2s
elif n1 > n2 then (a1, n1) :: addpoly p1s p2
else (a1+a2, n1) :: addpoly p1s p2s

let p1 = [(3.0, 5); (2.0, 2); ( 7.0, 1); (1.5, 0)]
let p2 = [(4.5, 7); (3.0, 4); (10.5, 3); (2.25, 2)]

let q = addpoly p1 p2
// val q : (float * int) list =
// [(4.5, 7); (3.0, 5); (3.0, 4); (10.5, 3); (4.25, 2); (7.0, 1); (1.5, 0)]

我想记录一下。当您更改的表示形式时多项式一点然后你就可以简化你的函数的实现。您可以将多项式表示为其系数列表。

例如,当你有这个多项式时

p1 = 5.0x^5 + 2.0x^2 + 7.0x

你也可以这样写

p1 = 1.5x^0 + 7.0x^1 + 2.0x^2 + 0.0x^3 + 0.0x^4 + 5.0x^5     

因此您可以使用此列表定义多项式:

let p1 = [1.5; 7.0; 2.0; 0.0; 0.0; 5.0]

这里有两个对表示进行操作的函数。 polyval 计算给定值的结果,polyadd 将两个多项式相加。实现相当简单:

// p1 = 1.5x^0 + 7.0x^1 + 2.0x^2 + 0.0x^3 + 0.0x^4 + 5.0x^5
let p1 = [1.5; 7.0; 2.0; 0.0; 0.0; 5.0]

// p2 = 0.0x^0 + 0.0x^1 + 2.25x^2 + 10.5x^3 + 3.0x^4 + 0.0x^5 + 0.0x^6 + 4.5x^7
let p2 = [0.0; 0.0; 2.25; 10.5; 3.0; 0.0; 0.0; 4.5]

// polyval: float list -> float -> float
let rec polyval ps x =
match ps with
| [] -> 0.0
| p::ps -> p + x * (polyval ps x)

// polyadd: float int -> float int -> float int
let rec polyadd ps qs =
match (ps, qs) with
| [], ys -> ys
| xs, [] -> xs
| x::xs, y::ys -> (x+y)::polyadd xs ys

let v = polyval p1 2.3
// val v : float = 349.99715

let p = polyadd p1 p2
// val p : float list = [1.5; 7.0; 4.25; 10.5; 3.0; 5.0; 0.0; 4.5]

关于recursion - F# 递归地添加多项式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35376734/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com