На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > Еще раз прошу совета... , Лисп - функции
      Имеется задание:Напишите функцию (count p x), которая подсчитывает, сколько атомов в списке x удовлетворяет предикату p (p-функция или функциональное имя). Список x не предполагается одноуровневым.
      Я написала фунцию, которая создает список из атомов, удовлетворяющих предикату p. Как сделать так, чтобы она еще и подсчитывала их количество?
      Вот мое творение:

      (defun count (p x)
      (if (null x) nil
      (if (funcall p (first x))
      (cons (first x) (count p (rest x)))
      (count p (rest x))
      )))

      Никак не могу ничего придумать... :wall:
        Если необходимо посчитать атомы "визуально", т.е. не рассматривая оканчивающий список nil, то так:

        ExpandedWrap disabled
          (defun count1 (p x)
            (if (atom x)
                (if (funcall p x) 1 0)
              (+ (count1 p (car x)) (if (null (cdr x)) 0 (count1 p (cdr x))))))


        Если по сути, т.е. учитывая оканчивающий список nil, то так:

        ExpandedWrap disabled
          (defun count2 (p x)
            (if (atom x)
                (if (funcall p x) 1 0)
              (+ (count2 p (car x)) (count2 p (cdr x)))))


        Разницу можно увидеть на следующем примере:

        ExpandedWrap disabled
          (count1 #'symbolp '(1 (2 3) (p (c 1) (nil))))
          => 3
          (count2 #'symbolp '(1 (2 3) (p (c 1) (nil))))
          => 8
          Огромное спасибо. Теперь все понятно :D
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0170 ]   [ 15 queries used ]   [ Generated: 7.05.24, 00:37 GMT ]