49、后缀形式是算术表达式的一种特定表示形式,其中每个运算符前都有其操作数。例如:(x + 7.0) 的后缀形式是 x 7.0 +,(x + 7.0) ∗(x −5.0) 的后缀形式是 x 7.0 + x 5.0 −∗。声明一个 F# 函数,其类型为 Fexpr -> string,用于计算表达式树的文本后缀形式。这里 Fexpr 类型定义如下:Fexpr 可以是常量(用浮点数表示)、变量 X、加法(两个 Fexpr 相加)、减法(两个 Fexpr 相减)、乘法(两个 Fexpr 相乘)、除法(两个 Fexpr 相除)、正弦函数(对一个 Fexpr 取正弦)、余弦函数(对一个 Fexpr 取余弦)、对数函数(对一个 Fexpr 取对数)、指数函数(对一个 Fexpr 取指数)。
要实现此函数,可根据 Fexpr 类型的定义进行递归处理,对于不同的构造函数(如 Const 、 X 、 Add 等)分别处理,将操作数和运算符按后缀形式组合成字符串。示例代码如下:
type Fexpr =
| Const of float
| X
| Add of Fexpr * Fexpr
| Sub of Fexpr * Fexpr
| Mul of Fexpr * Fexpr
| Div of Fexpr * Fexpr
| Sin of Fexpr
| Cos of Fexpr
| Log of Fexpr
| Exp of Fexpr
let rec postfixForm (fe: Fexpr) =
match fe with
| Const r -> string r
| X -> "X"
| Add (fe1, fe2) -> (postfixForm fe1) + " " + (postfixForm fe2) + " +"
| Sub (fe1, fe2) -> (postfixForm fe1) + " " + (postfixForm fe2) + " -"
| Mul (fe1, fe2) -> (postfixForm fe1) + " " + (postfixForm fe2) + " *"
| Div (fe1, fe2) -> (postfixForm fe1) + " " + (postfixForm fe2) + " /"
| Sin fe -> (postfixForm fe) + " sin"
| Cos fe -> (postfixForm fe) + " cos"
| Log fe -> (postfixForm fe) + " log"
| Exp fe -> (postfixForm fe) + " exp"
50、定义一个类型为BinTree<’a,’b>的二叉树,其定义如下:type BinTree<’a,’b> = | Leaf of ‘a | Node of BinTree<’a,’b> * ‘b * BinTree<’a,’b> 。声明以下函数:1. leafVals: BinTree<’a,’b> -> Set<’a>,使得leafVals t是树t的叶子节点中出现的值的集合;2. nodeVals: BinTree<’a,’b> -> Set<’b>,使得nodeVals t是树t的节点中出现的值的集合;3. vals: BinTree<’a,’b> -> Set<’a>*Set<’b>,使得vals t = (ls, ns),其中ls是树t的叶子节点中出现的值的集合,ns是树t的节点中出现的值的集合。
以下是可能的实现(使用F#语言示例):
open System.Collections.Generic
type BinTree<'a,'b> =
| Leaf of 'a
| Node of BinTree<'a,'b> * 'b * BinTree<'a,'b>
let rec leafVals (t: BinTree<'a,'b>) =
match t with
| Leaf a -> Set.singleton a
| Node (tl, _, tr) -> Set.union (leafVals tl) (leafVals tr)
let rec nodeVals (t: BinTree<'a,'b>) =
match t with
| Leaf _ -> Set.empty
| Node (tl, b, tr) -> Set.add b (Set.union (nodeVals tl) (nodeVals tr))
let vals (t: BinTree<'a,'b>) =
(leafVals t, nodeVals t)
上述代码定义了三个函数来满足题目要求。 leafVals 函数递归遍历树,收集叶子节点的值; nodeVals 函数递归遍历树,收集节点的值; vals 函数调用前两个函数,返回一个包含叶子节点值集合和节点值集合的元组。

最低0.47元/天 解锁文章
8336

被折叠的 条评论
为什么被折叠?



