Создать функцию палиндрома без функции добавления в выводе в схеме - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь создать функцию palyndrom, которая делает palyndrom из входной строки.Примерно так: (palindrome '(1 2 3 4)) ==> (1 2 3 4 3 2 1).

Я создал этот код ниже, но он возвращает меня (palindrome '(1 2 3 4)) ==> (1 (2 (3 (4) 3) 2) 1)

Мой код ниже.Задача НЕ использовать append или reverse.

  (define (palindrome l)
  (cond
           ((null? (cdr l)) (list (car l)))
        ((list (car l) (palindrome (cdr l)) (car l)))))

Спасибо за помощь.

1 Ответ

0 голосов
/ 24 декабря 2018

Как и в комментарии Sylwester, вы можете сделать свою собственную версию append или reverse.Вот пример, в котором определена только функция append (называемая concatenate).

(define (palindrome l)
  (define (concatenate l1 l2)
    (if (null? l1)
        l2
        (cons (car l1) (concatenate (cdr l1) l2))))
  (define (p l)
    (cond ((null? l) '())
          ((null? (cdr l)) l)
          (else (cons (car l) (concatenate (p (cdr l)) (list (car l)))))))
  (p l))

(palindrome '(1 2 3 4))

'(1 2 3 4 3 2 1)

Здесь вместо этого есть хвостовая рекурсивная версия:

(define (palindrome l)
  (define (concatenate l1 l2)
    (if (null? l1)
        l2
        (cons (car l1) (concatenate (cdr l1) l2))))
  (define (p l prefix suffix)
    (cond ((null? l) (concatenate prefix suffix))
          ((null? (cdr l)) (concatenate prefix (cons (car l) suffix)))
          (else (p (cdr l) (concatenate prefix (list (car l))) (cons (car l) suffix)))))
  (p l '() '()))
...