在 Scheme 中编写一个 While 循环
Writing a While Loop in Scheme
我正在尝试使用递归和 lambda 来实现 while 循环,但我只是不知道该怎么做。
我应该从这个 lambda 表达式开始:
((lambda (x) (x x)) (lambda (x) (x x))
我的第一个问题是为什么这会导致 'eternal' 递归?我试图理解它是如何工作的,但我就是无法理解它。
我也有这个代码要遵循:
((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 表达式作为我的 'starting point',我不想使用宏(这是我试图理解的自愿练习,所以我想遵循指导方针: ))
要查看计算 ((lambda (x) (x x)) (lambda (x) (x x))
时会发生什么,请使用 DrRacket 中的步进器。它可以向您展示评估所采取的步骤。
在 DrRacket 的定义 window 中写下你的表达式。
然后选择教学语言"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)
我正在尝试使用递归和 lambda 来实现 while 循环,但我只是不知道该怎么做。
我应该从这个 lambda 表达式开始:
((lambda (x) (x x)) (lambda (x) (x x))
我的第一个问题是为什么这会导致 'eternal' 递归?我试图理解它是如何工作的,但我就是无法理解它。
我也有这个代码要遵循:
((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 表达式作为我的 'starting point',我不想使用宏(这是我试图理解的自愿练习,所以我想遵循指导方针: ))
要查看计算 ((lambda (x) (x x)) (lambda (x) (x x))
时会发生什么,请使用 DrRacket 中的步进器。它可以向您展示评估所采取的步骤。
在 DrRacket 的定义 window 中写下你的表达式。 然后选择教学语言"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)