当我在OCaml的树上对函数进行编程时,我总是会遇到这个反复出现的问题:当我到达树的叶子时,我什么也不愿返回,但仍然希望我的程序继续进行。
更清楚地说,有时我有一些练习要求找到一个特定的节点n,所以我可以执行以下操作:(为简单起见,我在这里在二叉树上执行此操作):
let rec find_node n tree = match tree with
|Nil -> (* I don't want my program to stop here but then what can I return ?*)
|Node(l, k, r) as t when k =n -> t
|Node(l, _, r) -> find_node n l; find_node n r
我正在使用二进制树的以下表示形式:
type b_tree = Nil | Node of b_tree * int * b_tree
因此,基本上我希望我的程序继续运行,直到找到所需的内容为止,但是由于OCaml中的一个函数只有一个返回类型,因此我无法执行以下操作:
let rec find_node n tree = match tree with
|Nil -> () (*returning unit type here*)
|Node(l, k, r) as t when k =n -> t
|Node(l, _, r) -> find_node n l; find_node n r
那么,如何识别模式案例中的“不执行任何操作”?
谢谢 !
您需要问自己:在第三种情况下,您如何知道第一次递归找到了结果?您如何将其与不成功的递归区分开来?在两种情况下该怎么办?另外,如果整个树中没有满足您条件的节点怎么办?
因此,“不执行任何操作”不是您想要的,您需要以某种方式表明什么也没找到。
解决所有这些问题的一种显而易见的方法是返回一个选项,这将产生以下代码:
let rec find_node n tree =
match tree with
| Nil -> None
| Node ((_, k, _) as t) when k = n -> Some t
| Node (l, _, r) ->
match find_node n l with
| None -> find_node n r
| some -> some
返回类型为(b_tree * int * b_tree) option
,描述节点属性,或者为None
未找到节点时的返回类型。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句