Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 在Scheme中编写While循环_Loops_Recursion_Lambda_Scheme_R5rs - Fatal编程技术网

Loops 在Scheme中编写While循环

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递归实现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))(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中作为宏实现。请参阅这个或多或少重复的问题: