2015-05-12 3 views
1
(define (interchange list) 
    (if (empty? list) 
     list 
     (interchange (append (car (cdr list) X))))) 

Мне нужно создать функцию, которая меняет пары элементов в списке схем. Это то, что я придумал до сих пор, но я получаю сообщение об ошибке с empty?Функция схемы с одним параметром, который будет заменять каждые два элемента

Error 
empty?: undefined; 
cannot reference undefined identifier 

function call          output 
(interchange '())         () 
(interchange '(a))         (a) 
(interchange '(a b))        (b a) 
(interchange '(a b c))       (b a c) 
(interchange '(a 1 b 2 c 3 d 4))    (1 a 2 b 3 c 4 d) 
(interchange '(hello you -12.34 5 -6 enough)) (you hello 5 -12.34 enough -6) 
+0

На каком языке это написано в? '#lang racket'? '#lang scheme'? '#lang r5rs'? –

+0

#lang схема @AlexisKing –

+0

Это «схема» или «схема/база»? Первый должен иметь 'empty?', Но 'racket/base' и' schem/base' не предоставляют его. –

ответ

3

Попробуйте это:

(define (interchange lst) 
    (if (or (null? lst) (null? (cdr lst)))  ; if the list has 0 or 1 elements left 
     lst          ; then return the list, we're done 
     (cons (cadr lst)       ; otherwise grab the second element 
      (cons (car lst)     ; and the first element 
        (interchange (cddr lst)))))) ; and move forward two elements 

Хитрость заключается в том, чтобы обрабатывать два элемента на одной итерации, будучи осторожным с крайними случаями , Он работает, как ожидается, для ввода пробы:

(interchange '()) 
=> '() 
(interchange '(a)) 
=> '(a) 
(interchange '(a b)) 
=> '(b a) 
(interchange '(a b c)) 
=> '(b a c) 
(interchange '(a 1 b 2 c 3 d 4)) 
=> '(1 a 2 b 3 c 4 d) 
(interchange '(hello you -12.34 5 -6 enough)) 
=> '(you hello 5 -12.34 enough -6) 
+0

Как я могу сделать так, чтобы это продолжалось? У вас есть хорошие учебники? Я их действительно не нашел. Спасибо. –

+0

Есть буквально тонны хороших учебников и книг в Интернете, лично я бы порекомендовал «The Little Schemer» и «Как создавать программы», –

2
#lang racket 

(define (interchange xs) 
    (match xs 
    [(or '() (list _))     ; if the list is empty or has one element 
    xs]        ; then interchange keeps the original list 
    [(list* x y more)     ; if the list has two or more elements, 
    (list* y x (interchange more))])) ; then the result consists of the two 
;          ; first elements (with the order swapped) 
;          ; followed by the result of 
;          ; interchanging the remaining elements. 


(interchange '())         
(interchange '(a))        
(interchange '(a b))        
(interchange '(a b c))       
(interchange '(a 1 b 2 c 3 d 4))    
(interchange '(hello you -12.34 5 -6 enough)) 

Выход:

'() 
'(a) 
'(b a) 
'(b a c) 
'(1 a 2 b 3 c 4 d) 
'(you hello 5 -12.34 enough -6)