2015-05-16 2 views
2

Я пытаюсь реализовать цикл while, используя рекурсию с лямбдой, но я просто не понимаю, как это сделать.Написание цикла while в схеме

Я должен начать с этого лямбда-выражения:

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

Этот код вызывает цикл, который печатает с я = п до я = 0, но я не понимаю, это тоже. Если бы кто-то хотел объяснить использование лямбда здесь, я был бы благодарен :)

Редактировать: Я должен использовать это выражение лямбда как свою «отправную точку», и я не хочу использовать макросы (это добровольное упражнение, которое я пытаюсь понять, поэтому я хочу следовать рекомендациям :))

+0

Хотя, как правило, реализуется в виде макроса на схеме , См. Этот более или менее повторяющийся вопрос: http://stackoverflow.com/questions/10968212/while-loop-macro-in-drracket –

ответ

2

Чтобы узнать, что произойдет, когда ((lambda (x) (x x)) (lambda (x) (x x)) оценивается с использованием шага в DrRacket. Он может показать вам шаги, которые требует оценка.

Напишите свое выражение в окне определения DrRacket. Затем выберите язык обучения «Промежуточный студент с лямбдой». Затем нажмите кнопку шага (зеленый треугольник, за которым следует панель).

Вы увидите нечто похожее на изображение (который использует другую программу):

enter image description here

Update:

Попробуйте эту программу:

(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) 
+0

Хм, к сожалению, это не работает с началом. – user16655

+0

Я думаю, что это 'set!' Шагомер не может справиться. Может быть, мы сможем найти аналогичную программу? – soegaard

+0

Спасибо, это сработало :) Может быть, я немного мудрее, я не уверен. Можно ли включить лямбда-выражение в функцию, чтобы его можно было вызвать извне? – user16655

Смежные вопросы