Решение упражнения 2.17 из SICP

24 January, 2008 (20:59) | Решения упражнений

При нахождении последней пары мы просто будем двигаться по списку пар, начиная с головы списка, и проверять, не указывает ли хвостовой указатель головной пары (получаемый процедурой cdr) на nil. Как только мы обнаржим такую пару, мы ее вернем.

(define (last-pair list) 
  (if (null? (cdr list)) 
      list 
      (last-pair (cdr list))))

Написать код в данном случае даже проще, чем его описать. Это не случайно.

Comments

Comment from Spok
Date: January 31, 2014, 11:28 am

А можно и так. Хотя в данном варианте используется стандартный набор процедур Scheme стандарта R5RS

(define (last-pair li)
(if (null? li)
(display "Error, list is empty.")
(list-ref list (- (length li) 1))))

Comment from knagaev
Date: May 29, 2015, 1:17 pm

2Spok
Не оптимально – два прохода по всему списку, сначала для вычисления длины, а потом для поиска (length-1)-го элемента.

Comment from blabaster
Date: June 6, 2015, 3:52 am

А так не лучше:

(define (last-pair l)
  (let ((t (cdr l)))
    (if (null? t)
        l
        (last-pair t))))
 

Write a comment