是否可以使用call/cc来实现递归?

day*_*day 9 scheme functional-programming callcc

我想知道是否有可能定义一个递归函数而不在其体内调用函数本身,但不知何故使用call/cc代替?谢谢.

Chr*_*ung 13

您可以实现使用Y组合call/cc,如本文所述.(非常感谢John Cowan提到这个简洁的帖子!)引用那篇文章,这是Oleg的实现:

推论1. Y组合器通过call/cc- Y组合器没有明确的自我应用.

(define (Y f)
  ((lambda (u) (u (lambda (x) (lambda (n) ((f (u x)) n)))))
   (call/cc (call/cc (lambda (x) x)))))
Run Code Online (Sandbox Code Playgroud)

在这里,我们使用了一个事实

((lambda (u) (u p)) (call/cc call/cc))
Run Code Online (Sandbox Code Playgroud)

((lambda (u) (u p)) (lambda (x) (x x)))
Run Code Online (Sandbox Code Playgroud)

在观察上是等价的.


Joh*_*nts 6

你的问题有点模糊.特别是,听起来你想要一个使用call/cc来模拟递归调用而不直接进行递归调用的系统.但事实证明,你可以在不进行递归调用的情况下对递归调用进行建模,也可以不使用call/cc.例如:

#lang racket

(define (factorial f n)
  (if (= n 0) 1 (* n (f f (- n 1)))))

(factorial factorial 3)
Run Code Online (Sandbox Code Playgroud)

这可能看起来像是作弊,但它是Y组合者的基础.也许你可以收紧你想到的一系列限制?

PS:如果这是作业,请引用我!

  • 你所说的"自称"是什么意思?(自)递归函数定义中的自引用具有以下形式:您有一个函数定义,其主体包含一个标识符的出现,该标识符在词法上绑定到封闭函数本身.John提供的"factorial"的定义没有出现在体内的"factorial",也没有任何词法上与它绑定的标识符. (2认同)