2013-12-05 2 views
0

(поворот «(ABCDE)) должен возвращать ((ABCDE) (bcdea) (cdeab) (deabc) (eabcd))Поворот списка в схеме

Здесь я реализовал логику в shceme, но я столкнулся проблема может кто-нибудь помочь мне sovling этот

Вот мой код

(define (rotate lst) 
    (define (iter l cycles result) 
    (cond 
     ((= cycles 0) (cons lst result)) 
     ((< cycles 0) result) 
     (else   (let ((cycled (cycle l))) 
         (iter cycled (- cycles 1) (append result (list cycled))))))) 
    (iter lst (- (length lst) 1)())) 


(rotate '(a b c d e)) 
+0

Так что же делает ваш текущий код? Что не так? Что он выводит? –

ответ

0

Вы не были так далеко:

(define (rotate lst) 
    (define (iter lst cycles res) 
    (cond 
     ((= cycles 0) (reverse res)) 
     (else   (iter (append (cdr lst) (list (car lst))) 
          (- cycles 1) 
          (cons lst res))))) 
    (iter lst (length lst) null)) 
  • Не нужно проводить различие между циклами = 0, циклы> 0 и циклы < 0; достаточно одного базового футляра и одного рекурсивного футляра
  • Что такое (cycle l)? Он определен где-то в другом месте?
+0

Хорошо я получил его, и большое спасибо – user3071665

+0

(определяют (повернуть LST) (определяют (ИТЭР LST циклы Рез) (если (= циклы 0) (обратный рез) (ИТЭР (добавление (корд LST) (список (автомобиль lst))) (- циклы 1) (cons lst res)))) (iter lst (length lst)())) Это дает мой выход desierd – user3071665

+0

@ user3071665 Те же, за исключением вас нужно '(define null '()) 'в версии @ uselpa, и ваш комментарий имеет голый'() ', который должен быть указан. Вы заменили 'cond' на' if', но они точно такие же. Фактически, в большинстве реализаций 'cond' - это синтаксические правила, которые заканчиваются как' if' так же, как 'and' и' or'. – Sylwester

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