【发布时间】:2012-04-12 21:29:19
【问题描述】:
我想知道是否可以定义一个递归函数而不在其主体中调用函数本身,而是以某种方式使用 call/cc 来代替?谢谢。
【问题讨论】:
标签: functional-programming scheme callcc
我想知道是否可以定义一个递归函数而不在其主体中调用函数本身,而是以某种方式使用 call/cc 来代替?谢谢。
【问题讨论】:
标签: functional-programming scheme callcc
您可以使用call/cc、as described here 实现 Y 组合器。 (非常感谢 John Cowan 提到这篇简洁的帖子!)引用该帖子,这是 Oleg 的实现:
推论 1. 通过
call/cc的 Y 组合器 -- 没有显式自应用的 Y 组合器。(define (Y f) ((lambda (u) (u (lambda (x) (lambda (n) ((f (u x)) n))))) (call/cc (call/cc (lambda (x) x)))))在这里,我们使用了一个事实
((lambda (u) (u p)) (call/cc call/cc))和
((lambda (u) (u p)) (lambda (x) (x x)))在观察上是等效的。
【讨论】:
你的问题有点含糊。特别是,听起来您想要一个使用 call/cc 来模拟递归调用而不直接进行递归调用的系统。然而,事实证明,您可以在不进行递归调用的情况下对递归调用进行建模,也在不使用 call/cc 的情况下进行建模。例如:
#lang racket
(define (factorial f n)
(if (= n 0) 1 (* n (f f (- n 1)))))
(factorial factorial 3)
这看起来像是作弊,但它是 Y 组合器的基础。也许您可以收紧您正在考虑的一系列限制?
P.S.:如果这是作业,请引用我!
【讨论】:
factorial。这不是家庭作业!谢谢。
call/cc 提供什么?
f 指的是它自己,不是吗?我想看看call/cc 能走多远,特别是考虑到它的能力,我们能不能用它来模拟定义递归函数的常用或不寻常的方式。
factorial 的定义没有出现在正文中的factorial,也没有任何在词法上绑定到它的标识符。
恐怕call/cc 与此无关。实际上只有两种定义递归函数的方法:
f 可以引用函数g,其主体引用f。在这种情况下,您只需按照通常的方式编写即可。所以对于factorial,你可以这样写:
(define (factorial-step recurse n)
(if (zero? n)
1
(* n (recurse (- n 1)))))
Y 组合器的神奇之处在于它构造了recurse 函数,该函数将被馈送到factorial-step。
【讨论】: