在Scheme

时间:2015-05-16 20:25:13

标签: 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表达式作为我的起点',我不想使用宏(它是一个自愿的运动,我试图理解,所以我想遵循指南:))

1 个答案:

答案 0 :(得分:2)

要查看评估((lambda (x) (x x)) (lambda (x) (x x))时会发生什么,请使用DrRacket中的步进器。它可以显示评估所采取的步骤。

在DrRacket的定义窗口中编写表达式。 然后选择教学语言“中级学生与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)