Loops 在Scheme中编写While循环
我试图用lambda递归实现while循环,但我不知道如何实现 我应该从这个lambda表达式开始:Loops 在Scheme中编写While循环,loops,recursion,lambda,scheme,r5rs,Loops,Recursion,Lambda,Scheme,R5rs,我试图用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
((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))(lambda(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)
我想这是
设置!
步进机无法处理。也许我们可以找到一个类似的程序来尝试?谢谢,成功了:)也许我更聪明一点,我不是很确定。是否可以将lambda表达式放入函数中,以便从外部调用它?(定义f(lambda(x)(x)))也许您会喜欢这篇博文。它是关于通过您正在试验的机制实现递归的。我读了这篇文章,但我仍然在尝试生成一个循环。问题是我想将条件和主体作为参数发送给函数,但我似乎不明白如何将其与lambda表达式结合起来。。。我也必须使用上面的lambda表达式,所以我被卡住了。如果我不了解它,这不是问题,因为这是一个自愿的练习,但令人沮丧的是,我不知道它是如何工作的。而通常在Scheme中作为宏实现。请参阅这个或多或少重复的问题: