我正在尝试使用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表达式作为我的起点',我不想使用宏(它是一个自愿的运动,我试图理解,所以我想遵循指南:))
答案 0 :(得分:2)
要查看评估((lambda (x) (x x)) (lambda (x) (x x))
时会发生什么,请使用DrRacket中的步进器。它可以显示评估所采取的步骤。
在DrRacket的定义窗口中编写表达式。 然后选择教学语言“中级学生与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)