loops - 在Scheme中编写While循环

标签 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! 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”。然后单击步进器按钮(绿色三角形后跟一个条)。

您将看到类似于图像的内容(使用不同的程序):

enter image description here

更新:

试试这个程序:

(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/

相关文章:

python - Python 中使用 enumerate 的 for 循环和使用 xrange 的 for 循环哪个更快?

r - 在 R 中循环以创建和保存具有指定名称的一系列 ggplot2 图

ruby - 递归例程中的 "stack level too deep"错误是否有解决方法?

c# - 如何在 lambda 表达式中定义为 LINQ Select 方法中的另一个函数

Python:在没有列表的情况下取第一个字符

在 C 中使用 while 循环的复合条件。

Java-递归: When does statements after a recursive method call executes

recursion - 使用 Swift 运算符定义避免无限递归?

c# - 关于 lambda 表达式的专家意见 - ViewModels

javascript - x-amzn-错误类型 :UnrecognizedClientException While Calling AWS Api gateway with temporary Credentials