dag*_*lee 4 f# binary-tree exit
我知道递归函数是F#中一种强大的技术.我的问题是:是否有退出语句,它可以跳出递归函数,就像命令式语言一样.例如,将节点插入二叉树.
type Tree<'a> when 'a :> IComparable<'a> =
| Nil
| Leaf of 'a
| Node of Tree<'a> * 'a * Tree<'a>
let tt2 = Node(
Node(Leaf "D", "B",Node(Leaf "G", "E", Leaf "H" )),
"A",
Node(Nil, "C", Node(Nil, "F", Leaf "I")))
let rec contains (x : #IComparable<'a>) = function
| Nil -> false
| Leaf y -> if x.CompareTo(y) = 0 then true else false
| Node(l, y, r) ->
match l, y, r with
| l, y, Nil -> if x.CompareTo(y) = 0 then true else contains x l
| Nil,y, r -> if x.CompareTo(y) = 0 then true else contains x r
| _ -> if x.CompareTo(y) = 0 then true
else contains x r |>ignore
contains x l
let xx = contains "C" tt2 //It is wrong answer.
Run Code Online (Sandbox Code Playgroud)
pad*_*pad 10
是否有退出语句,它可以跳出递归函数,就像命令式语言一样.
不是.原因是您可以通过递归函数和模式匹配来编码命令性中断/返回.如果您想要中断,只需返回一个值,否则调用另一个递归调用.
这个问题更适合要求高阶函数.当您需要提前退出高阶函数时,编写自定义递归函数是可行的方法.如果您对F#中的命令式构造感兴趣,请查看@Tomas 的优秀系列.
确定条件后,您的函数将在某个分支处退出.唯一的问题是你不应该contain x r在倒数第二行丢弃.
if/else为清晰起见,您可以删除多余的
let rec contains (x : #IComparable<'a>) = function
| Nil -> false
| Leaf y -> x.CompareTo(y) = 0
| Node(l, y, r) ->
match l, y, r with
| l, y, Nil -> x.CompareTo(y) = 0 || contains x l
| Nil,y, r -> x.CompareTo(y) = 0 || contains x r
| _ -> x.CompareTo(y) = 0 || contains x l || contains x r
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2042 次 |
| 最近记录: |