Я воспроизвожу функцию длины ракетки, используя только машину & cdr, чтобы сравнить длину двух списков и вернуть более короткую из двух.Эффективный метод репликации функции длины
Функция длины просто положить является:
(define length
(lambda (list)
(if (null? list)
0
(+ 1 (length (cdr list))))))
и при использовании в сравнении двух списков
(define short
(lambda (list1 list2)
(if (<= (length list1) (length list2))
list1
list2)))
> (short '(a b c) '(1 2 3 4 5 6 7))
вернет «(а б).
Однако этот метод неэффективен, особенно когда один список намного длиннее другого, так как он будет перебирать оба списка перед возвращением короче.
У меня более эффективный метод ниже. Однако мне было интересно, был ли более эффективный/альтернативный метод получения более короткой длины, не проверяя конца обоих списков. Возможно, рекурсивно просматривая списки одновременно с car/cdr, пока более короткий список не достигнет своего конца.
(define shorter?
(lambda (list1 list2)
(and (not (null? list2))
(or (null? list1)
(shorter? (cdr list1) (cdr list2))))))
(define shorter
(lambda (list1 list2)
(if (shorter? list2 list1)
list2
list1)))
Это не ответит на вопрос –
Да, это так ... – user7487664