recursion - 用于查找不动点的 OCaml 函数
问题描述
我有一个用于查找固定点的 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*2
,fix cubed (2*2*2)*(2*2*2)*(2*2*2)
以此类推。这个函数如何正确找到不动点0
?
解决方案
或多或少是偶然的。
正在发生的事情是您正在使用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
推荐阅读
- c - 为什么当我从同一个指针获取值时结果不同
- tensorflow - pytorchgather()的tensorflow等效实现
- r - R GGPLOT2 Alternate panel.background 填充白色和灰色
- salesforce - Salesforce SFDX 在创建项目时出错
- python - python如何在无限循环期间处理KeyboardInterrupt?
- python - 如何将 yolo 权重转换为 tflite 文件
- java - Wildfly 快速入门 不可解析的导入 POM:未能找到 org.wildfly:wildfly-parent:pom:20.0.0.Beta1-SNAPSHOT
- c - 如何使用 Ecpise 检测 C 中的堆栈粉碎
- javascript - 无法获取 AWS 开发工具包 Lambda 的 addrinfo
- android - Android home screen widget, create from activity