Схема списка манипуляций (рекурсия) - PullRequest
4 голосов
/ 10 марта 2011

Основная проблема заключается в том, чтобы при получении списка возвращать все элементы этого списка, кроме последнего элемента.Например, данный (abcd) -> возврат (abc).По сути, у меня есть эта функция, у меня проблемы с синтаксисом схемы, и Google не очень дружелюбен.Я не уверен, правильно ли я использую cons.

(define all-but-last
  (lambda (x)

   (if (null? (cdr x)) 
      ('()))
   (cons ((car x) (all-but-last(cdr x)))
)))

Кто-то, кто разбирается в синтаксисе схемы r5rs, будет полезен.Спасибо!

Ответы [ 5 ]

3 голосов
/ 10 марта 2011

Если вы удалите лишние скобки вокруг '() и аргументы для cons, код будет работать (для непустых списков ввода).

2 голосов
/ 10 марта 2011

Используя DrRacket с Language R5RS, это работает:

(define all-but-last
  (lambda (x)
   (if (null? x)
     '()
     (if (null? (cdr x)) 
       '()
       (cons (car x) (all-but-last(cdr x)))))))
1 голос
/ 18 мая 2012

Альтернативное решение:

(define (all-but-last xs)
  (reverse 
    (rest
      (reverse xs))))
0 голосов
/ 11 августа 2014

если вы передадите '() своей функции, я думаю, что вы должны дать сообщение об ошибке, отличное от return' ()

0 голосов
/ 10 марта 2011

Смотрите ответы на этот вопрос:

удаление последнего элемента списка (схемы)

Кроме того, я собираюсь отметить это как "домашнее задание". Если это не так, дайте мне знать, и я удалю его.

...