用于查找固定点的OCaml函数

时间:2019-02-27 03:57:51

标签: recursion ocaml fixed-point

我具有OCaml函数,用于查找固定点:

>> let rec fix f x =
     let x' = f x in
       if x = x' then x else fix f x';;
(system message) val fix : ('a -> 'a) -> 'a -> 'a = <fun>

问题是,我在输入时不了解它的工作原理

>> let cubed x = x*x*x;;
(system message) val cubed : int -> int = <fun>

>> fix cubed 2;;
(system message) - : int = 0

据我了解,fix cubed 2将进入fix cubed 2*2*2fix cubed (2*2*2)*(2*2*2)*(2*2*2)等的无限循环。该功能如何正确找到定点0

1 个答案:

答案 0 :(得分:5)

或多或少是偶然的。

正在发生的事情是您使用cubed的2的幂,这导致2的幂更大。经过几轮此操作后,结果将足够大以至于溢出并被截断-并且2的大数幂将截断为零,这恰好是此函数的固定点。

要完全清楚,OCaml不会进行任何复杂的搜索或欺骗,fix只是一个循环,在这种情况下恰好以一个有用的答案终止。

您可以在顶层使用#trace来查看它的发生情况:

# #trace cubed;;
cubed is now traced.
# fix cubed 2
  ;;
  cubed <-- 2
cubed --> 8
cubed <-- 8
cubed --> 512
cubed <-- 512
cubed --> 134217728
cubed <-- 134217728
cubed --> 0
cubed <-- 0
cubed --> 0
- : int = 0