2015-09-09 2 views
1

Я следую за введением в Информатику, используя Схему. Я вхожу в следующую проблему, и я придумываю решение, однако, похоже, что я потерялся в синтаксисе.Получить последний элемент списка на схеме

Определить процедуру последнюю пару, которая возвращает список, содержащий только последний элемент данной (непустой) списка: (последней пары (список 23 72 149 34))

Вот мое решение :

(define (last-pair array) 
    ((define (get-last (length array) array)) 
     (if (= (length array) 1) (car array) 
     (get-last (- 1 (length array)) (cdr array)))))) 

Здесь ошибка: ошибка: Недопустимая лямбда: (лямбда ((длина массив) массив))

ответ

2

ошибки в:

(define (get-last (length array) array) 

Когда вы определяете функцию, вы должны перечислить имя функции и ее аргументы:

(define (function-name arg1 arg2 ... argN) ... 

(length array) не может быть аргументом: это вызов функции.

В любом случае, нет необходимости определять get-last. Что-то вроде этого достаточно:

(define (last-pair array) 
    (if (= (length array) 1) 
     array 
     (last-pair (cdr array)))) 
+1

Я бы отказался от использования 'length'. «длина» - неприятная привычка. – molbdnilo

+0

Согласен. Я просто придерживался первоначального подхода. В этом случае, возможно, самым простым было бы что-то вроде '(car (reverse array))' –

3

В вашей процедуры вы вызываете определение ..

+ ; ==> <procedure: +> (how it's printed varies but it is the value that can be called) 
(+) ; ==> 0 
^- this calls the result for evaluation `+` which is `<procedure: +>` 

((define something ...)) ; == (undefined-value) == Error! 
^- this calls the result of `(define something ...)`. 

define будет возвращать некоторое значение зависит от реализации и в докладе, это просто говорит, что это не определено. Вы не можете предположить, что это же значение, что something связан с (что было бы хорошее неопределенное значение)

Также формат вашего местного define не использует стандартные расширения, которые могут быть нормально для некоторых реализаций Scheme, и это определено в SRFI-16 , но это не переносная функция.

(define (get-last (length array) array) 
    ...) 

Таким образом, на языке, который не позволяет этого, вы получите сообщение об ошибке, в то время как языки, поддерживающие расширение, не могут.

Разница между последней парой и парой до того, как это значение cdr. (cdr '(1 . 2)) ; ==> 2 в то время как (cdr '(0 1 . 2)) ; ==> (1 . 2). Таким образом, вы можете просматривать список, пока не упретесь в нон pair? значение для cdr:

(define (last-pair lst) 
    (if (pair? (cdr lst)) 
     (last-pair (cdr lst)) 
     lst)) 

(last-pair '(1 2 3 4 . 5)) ; ==> (4 . 5) 

Заметим, что это не сработает, если вы не даете ему пару, чтобы начать с, так же, как и carcdr.

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