我正在尝试使用 lambda 递归来实现 while 循环,但我只是不明白该怎么做。
我应该从这个 lambda 表达式开始:
((lambda (x) (x x)) (lambda (x) (x x))
我的第一个问题是为什么这会导致“永恒”递归?我试图理解它是如何工作的,但我就是无法理解它。
我还有这个代码要处理:
((lambda (x) (x x))
(lambda (x)
(if (not (= i 0))
(begin
(display i)
(set! i (- i 1))
(x x))
)))
这段代码会导致一个从 i = n 打印到 i = 0 的循环,但我也不明白这一点。如果有人愿意在这里解释 lambda 的用法,我将不胜感激:)
编辑:我必须使用这个 lambda 表达式作为我的“起点”,并且我不想使用宏(这是我尝试理解的自愿练习,所以我想遵循指南:))
最佳答案
要查看计算 ((lambda (x) (x x)) (lambda (x) (x x))
时会发生什么,请使用 DrRacket 中的步进器。它可以向您显示计算的步骤需要。
在DrRacket的定义窗口中写下你的表达式。 然后选择教学语言“Intermediate Student with lambda”。然后单击步进器按钮(绿色三角形后跟一个条)。
您将看到类似于图像的内容(使用不同的程序):
更新:
试试这个程序:
(define i 5)
((lambda (x) (x x))
(lambda (x)
(if (not (= i 0))
(x x)
'ignore)))
更新:
(define i 5)
(define f
(lambda (x)
(if (not (= i 0))
(begin
(display i)
(set! i (- i 1))
(x x))
'done)))
(f f)
或者根本没有任何定义:
((lambda (f) (f f))
(lambda (x)
(if (not (= i 0))
(begin
(display i)
(set! i (- i 1))
(x x))
'done)))
这里没有外部变量:
((lambda (f i) (f f i))
(lambda (x i)
(if (not (= i 0))
(begin
(display i)
(x x (- i 1)))
'done))
5)
使用while
函数:
(define (while body . args)
(apply body body args))
(while (lambda (loop i)
(if (not (= i 0))
(begin
(display i)
(loop loop (- i 1)))
'done))
5)
关于loops - 在Scheme中编写While循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30280394/