Как правильно получить увеличивающуюся переменную здесь? - PullRequest
0 голосов
/ 10 октября 2018
(define (teken-n x y n)
  (if (not (zero? n))
      (begin
        (teken-symbolen x y)
        (teken-n x y (- n 1)))))

(define (teken-symbolen-combinatie x y n)
  (if (not (zero? n))
      (begin
        (let ((acc 0))
          (teken-n x y (+ acc 1))
          (newline)
          (teken-symbolen-combinatie x y (- n 1))))))

Использование (teken-n x y n) для печати 2 символов, 'x 'y в виде xyx n раз на 1 строке без пробелов.Это работает правильно.

то, что я пытаюсь сделать с помощью (teken-symbolen-combinatie x y n), будет выводом

(teken-symbolen-combinatie '- '* 3)
-*-
-*--*-
-*--*--*-

Мой код дает только первую комбинацию символов, в этом примере - * - 3раз отделены новой строкой.Это означает, что последняя переменная моей первой функции не увеличивается правильно.Я не могу понять, почему.

РЕДАКТИРОВАТЬ: исправление ошибок в вопросе

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Это может быть то, что вы ищете (не проверено; у меня нет других ваших функций)

(define (teken-symbolen-combinatie x y n)
  (define (loop acc)
    (if (not (= acc n))
    (begin
      (teken-n x y (+ acc 1))
      (newline)
      (loop (+ acc 1)))))
  (loop 0))

Здесь используется предложение @ Svante о создании внутреннего цикла: здесь это рекурсивнофункция с именем loop, которая вызывает себя с увеличивающимся счетчиком.После определения внешняя функция запускает цикл с начальным значением 0.

Это довольно распространенный шаблон в Scheme: определить функцию внутри другой, которая работает как цикл, вызывая себя рекурсивно.Если внутренний цикл является хвостово-рекурсивным, Scheme оптимизирует его так, чтобы он работал fast !

0 голосов
/ 10 октября 2018

То, что не увеличивается, это acc.Функция + возвращает новое значение, она не меняет ни одного из своих аргументов.

Обычный способ в Схеме состоит в том, чтобы иметь внутренний цикл, имеющий другую переменную (которая, по-видимому, и является вашей *).1005 * предназначен для) увеличения до n.Вам не нужно иметь цикл внешней функции.

...