Сложенные ответы будут работать. Однако, если это домашнее задание, вы можете попытаться сделать это, используя только простые встроенные функции. Есть два возможных ответа.
Вот наивный способ:
(define (howMany list)
(if (null? list)
0
(+ 1 (howMany (cdr list)))
)
)
(Ваша реализация Схемы может иметь функцию empty?
вместо null?
.)
Однако этот алгоритм будет занимать объем пространства, линейно пропорциональный количеству элементов в списке, потому что он будет хранить (+ 1 ...)
для каждого элемента списка перед выполнением любого из дополнений. Интуитивно, вам это не нужно. Вот лучший алгоритм, который позволяет избежать этой проблемы:
(define (howMany list)
(define (iter numSoFar restOfList)
(if (null? restOfList)
numSoFar
(iter (+ numSoFar 1) (cdr restOfList))
)
)
(iter 0 list)
)
(Бонусные баллы: используйте синтаксис Scheme (let iter ...)
, чтобы написать это более кратко. Я использовал этот стиль, потому что он более понятен, если вы знаете только несколько примитивов Scheme.)