В основном мне нужно установить начальное значение (1) и считать до моего n и обратно до единицы. И для каждого расчета мне нужно отображать значение. Вот что у меня сейчас:

(define (teken-symbolen x y)
  (begin (display x) (display y) (display x)))


(define (teken-n x y n)
  (cond ((or(= n 0) (< n 0)) (display onmogelijk))
        ((= n 1) (teken-symbolen x y))
        (else (begin
                (teken-symbolen x y)
                (teken-n x y (- n 1))))))

В настоящее время это отображает значение n только тогда, когда мне нужно отображать все вычисления от одного до моего значения n и обратно до одного, все в другой строке, для чего я решил использовать (новую строку).

Любая помощь, я был бы очень признателен.

0
LLScheme 14 Окт 2018 в 13:33

1 ответ

Лучший ответ

Подумайте, что должно произойти, когда .. Напр. если вы напишете

(begin (display 1)
       (display 2)
       (display 3))

В каком порядке отображаются числа? Итак, давайте превратим это в то, что вам нужно сделать. Понятия не имею, почему вы считаете, что x и y - хорошие значения, поэтому я думаю, у вас должен быть контракт .. Поскольку вы уже знаете первое значение (1), вам нужно только {{X2} } поэтому я предлагаю:

(define (print-to-and-from n)
  ...)

Вот некоторые ожидания

(print-to-and-from 0) ; nothing printed (or whatever)
(print-to-and-from 1) ; 1 printed only once (perhaps)
(print-to-and-from 2) ; 1, 2, 1 printed
(print-to-and-from 3) ; 1, 2, 3, 2, 1 printed

Вам нужно знать, что вы в настоящее время находитесь на 1 или 2 и т. Д., Поэтому вам нужна привязка, которая не является частью контракта. Вы можете сделать это с помощью помощника.

(define (print-to-and-from n)
  (define (helper cur)
    ; In here you can compare cur to n
    ; and increase cur on consecutive calls
    ...)
  (helper 1))

Теперь, если вы посмотрите на результаты 2 и 3 с точки зрения отношения к 2 и 3, вы увидите, что вторая рекурсия (print-to-and-from 3) то же, что и (print-to-and-from 2). Таким образом, вы хотите, чтобы регистр по умолчанию печатался до и после следующей рекурсии, чтобы вы печатали 1, затем выполняли 2, 3, 2, вы возвращали управление и печатали 1 с первого шаг. Точно так же, как первый код в моем anser, за исключением того, что второй display является вызовом helper.

Также обратите внимание, что при остановке он печатает значение остановки только один раз, даже если оно равно 1. Таким образом, в базовом случае нужно печатать только текущее значение.

NB Возможно, проще сделать вспомогательную переменную глобальной. Это делается с помощью лямбда-лифтинга. например. сделать все закрывающие переменные связанными:

(define (print-to-and-from-helper cur n)
  ; In here you can compare cur to n
  ; and increase cur on consecutive calls
  ...)

(define (print-to-and-from n)
  (print-to-and-from-helper 1 n))

Это не сильно меняет программу, за исключением того, что вам нужно написать еще немного. Преимущество в том, что вы можете протестировать помощника индивидуально. Удачи!

0
Sylwester 14 Окт 2018 в 13:23