谁给我讲解一下这段Y组合子(Y-combinator)代码?
mathematica吧
全部回复
仅看楼主
吧务
level 15
xzcyr 楼主
此问题是在阅读SE帖子《Recursive anonymous functions with |-> notation》(编号316940)及《Can someone explain this snippet: (#[#] &)[#[#][#] &]》(1532)中产生的。闲话少叙,谁能给我讲讲怎么理解下面这段代码?:
Y[f_] := #[
#] &[Function[n, f[#
[#]][n]] &]
fac[r_] := If[# < 2, 1,
#*r[#
- 1]] &
Y[fac][4]
(* 24 *)
啊我并不是想要求教这段代码的语法,这段代码涉及的所有语法我(大概)都懂,但是连在一起我就不明白了……应该说,这段代码(似乎)并没有用到什么高级语法,它所做的只是纯函数嵌套(在 Mathematica 核心语言里这算是很基础的内容了),可是,为什么这么嵌套就会产生递归?有人能以比较易懂的方式讲解一下吗?
预先说一句,请不要糊AI生成的内容上来,一经发现封10天,勿谓言之不预。
2025年11月13日 15点11分 1
level 3
直接看wiki/Lambda_calculus,有相关的内容。大致就是Y满足Y[f]=f@Y[f]],作为递归不动点,然后某个f[...]有上值1就可以Evaluate了。
2025年11月14日 03点11分 2
……你说的“上值”是?(Mathematica里“上值”这个词一般指能用UpValues检查的那玩意儿,顶楼的代码并不涉及这个。)
2025年11月14日 04点11分
@xzcyr 这个不重要吧,总之就是有个终止值。重要的还是不动点结构,涉及到lambda演算的知识
2025年11月14日 09点11分
level 9
好烧脑啊;这样写于我来说好理解一点;
fac[r_] := If[
# < 2, 1, #
*r[# - 1]] &
fac[
Function[n, fac[#1[#1]][n]] &[
Function[n, fac[#1[#1]][n]] &]
][4]
(* 24 *)
2025年11月15日 07点11分 3
level 7
看上去应该只是把Y组合子翻译成了mathematica语言,这里贴一个Y组合子是怎么构造的文章,是我读过的最通俗易懂的一篇:
知乎专栏 720571320
2025年11月20日 01点11分 4
1