Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
0 / 0 / 1
Регистрация: 05.03.2013
Сообщений: 16

Числовые функции LISP

05.03.2014, 11:36. Показов 2844. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, необходимо решить 3 задачи:
1. Подсчитать число и сумму цифр целого N. Попробовал, написал 2 проги, а объединить не могу.
Lisp
1
2
(defun kolvo (n)
  (cond ((< n 10) n)(t (+ 1 (kolvo (/ n 10))))))
Lisp
1
2
(defun sum (n)
  (cond ((< n 10) n)(t (+ (rem n 10)(sum (/ n 10))))))
2. Найти все общие делители натуральных M и N.
3. Найти наибольший общий делитель чисел из заданного списка.
Помогите пожалуйста. Пишу как в autolisp, так и clisp.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.03.2014, 11:36
Ответы с готовыми решениями:

Какие числовые предикаты есть в lisp'e?
есть ли в лиспе еще какие нибудь числовые предикаты, кроме zerop, plusp, minusp?

Определить функцию SUM-NUMERIC-ELEMENTS, которая складывает все числовые значения в списке, игнорируя не числовые элементы
Доброго времени суток, помогите пожалуйста написать функцию SUM-NUMERIC-ELEMENTS, которая складывает все числовые значения в списке,...

Lisp Функции
Здравствуйте, помогите пожалуйста решить задание Вычислить значения следующих вызовов с пошаговым объяснением: 1. (apply ’cons ’(a...

10
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38189 / 21124 / 4307
Регистрация: 12.02.2012
Сообщений: 34,730
Записей в блоге: 14
05.03.2014, 11:46
HomeLisp:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
(defun sum-dig (n)
  (if (zerop n) 0 (+ (% n 10) (sum-dig (\ n 10)))))
 
==> sum-dig
 
(sum-dig 123)
 
==> 6
 
(defun num-dig (n)
  (if (zerop n) 0 (+ 1 (num-dig (\ n 10)))))
 
==> num-dig
 
(num-dig 123)
 
==> 3
2
0 / 0 / 1
Регистрация: 05.03.2013
Сообщений: 16
05.03.2014, 11:47  [ТС]
Мне необходимо их объединить в одну программу.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38189 / 21124 / 4307
Регистрация: 12.02.2012
Сообщений: 34,730
Записей в блоге: 14
05.03.2014, 12:04
Возвращаем список из двух элементов: первый - сумма цифр, второй - количество.

Lisp
1
2
3
4
5
6
7
8
(defun sum-num-dig (n &optional (s 0) (m 0))
  (if (zerop n) (list s m) (sum-num-dig (\ n 10) (+ s (% n 10)) (+ m 1))))
 
==> sum-num-dig
 
(sum-num-dig 123)
 
==> (6 3)
Или (с использованием аппарата возврата множества значений):

Lisp
1
2
3
4
5
6
7
8
9
(defun sum-num-dig (n &optional (s 0) (m 0))
  (if (zerop n) (values s m) (sum-num-dig (\ n 10) (+ s (% n 10)) (+ m 1))))
 
==> sum-num-dig
 
(sum-num-dig 123)
 
==> 6 ;; сумма
3 ;; количество
2
0 / 0 / 1
Регистрация: 05.03.2013
Сообщений: 16
05.03.2014, 12:12  [ТС]
Спасибо, а 2 последних задания можете помочь?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38189 / 21124 / 4307
Регистрация: 12.02.2012
Сообщений: 34,730
Записей в блоге: 14
05.03.2014, 12:26
Список общих делителей:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
(defun common-div (m n)
  (let ((q (min n m)) (res nil))
    (iter (for i from 2 to q)
      (when (and (zerop (% m i)) (zerop (% n i))) (collecting i into res))) res)) 
 
==> common-div
 
(common-div 123 45)
 
==> (3)
 
(common-div 1024 65536)
 
==> (2 4 8 16 32 64 128 256 512 1024)
2
0 / 0 / 1
Регистрация: 05.03.2013
Сообщений: 16
05.03.2014, 13:13  [ТС]
Выдает ошибку, что функция iter не определена.

Добавлено через 33 минуты
Можно ли последний код в common lisp преобразовать?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38189 / 21124 / 4307
Регистрация: 12.02.2012
Сообщений: 34,730
Записей в блоге: 14
05.03.2014, 13:16
Без iter

Lisp
1
2
3
4
5
6
7
8
9
10
(defun common-div (m n)
  (let ((q (min n m)) (res nil))
    (dotimes (i q res)
      (when (and (zerop (% m (+ i 1))) (zerop (% n (+ i 1)))) (push (+ i 1) res)))))
 
==> common-div
 
(common-div 1024 65536)
 
==> (1024 512 256 128 64 32 16 8 4 2 1)
1
0 / 0 / 1
Регистрация: 05.03.2013
Сообщений: 16
05.03.2014, 13:22  [ТС]
Большое спасибо за помощь. Последнее сделал сам.
0
493 / 426 / 56
Регистрация: 29.04.2011
Сообщений: 443
05.03.2014, 15:30
Лучший ответ Сообщение было отмечено как решение

Решение

Lisp
1
2
3
4
5
6
7
 ; 1.
(defun F (n &optional result)
    (cond 
        ((zerop n) (list 'sum '= (apply #'+ result) 'quantity '= (length result)))
        (t (F (\ n 10) (append result (list (% n 10)))))))
    
(f 1154) ==> (sum = 11 quantity = 4)
Lisp
1
2
3
4
5
6
7
8
9
;  2.
(defun F (n m &optional (i 2) (dv (if (< n m) n m)))
    (cond
        ((eq i (+ dv 1)) nil)
        (t (if (funcall #'(lambda (x y) (if (and (zerop (% x i)) (zerop (% y i))) t nil)) n m)
            (cons i (F n m (+ i 1) dv))
            (F n m (+ i 1) dv)))))
 
(f 1024 256) ==> (2 4 8 16 32 64 128 256)
4
 Аватар для castorsky
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
05.03.2014, 22:52
Лучший ответ Сообщение было отмечено как решение

Решение

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#lang scheme
 
(define (% x y) (remainder x y))
 
;;1
(define (foo1 n)
  (define (count x counter)
    (if (<= x 0) counter
        (count (/ (- x (% x 10)) 10) (+ 1 counter))))
  (define (sum x result)
    (if (<= x 0) result
        (sum (/ (- x (% x 10)) 10) (+ result (% x 10)))))
  (list (count n 0) (sum n 0)))
 
;;2 very very slow and bad
(define (foo2 x y)
  (define (iter num)
    (cond ((or (> num x) (> num y))
           '())
          ((and (= (% x num) 0) (= (% y num) 0))
           (append (list num) (iter (+ num 1))))
          (else (iter (+ num 1)))))
  (iter 1))
 
;;3 very very slow and bad
(define (foo3 lst)
  (define (min-lst m l1)
    (cond ((null? l1) m)
          ((> m (car l1)) (min-lst (car l1) (cdr l1)))
          (else (min-lst m (cdr l1)))))
  (define (divisior? n l1)
    (if (null? l1) #t
        (and (= (% (max (car l1) n) (min (car l1) n)) 0)
             (divisior? n (cdr l1)))))
  (define (iter num stop storage)
    (cond ((> num stop) storage)
          ((divisior? num lst)
           (iter (+ num 1) stop num))
          (else (iter (+ num 1) stop storage))))
  (iter 1 (min-lst (car lst) lst) 1))
4
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.03.2014, 22:52
Помогаю со студенческими работами здесь

Функции в Lisp
Здравствуйте! Нужно написать некоторые функции, а так как осень плохо разбираюсь в Lisp, то для меня это трудно. Очень нужна помощь. ...

Функции на Visual Lisp
Помогите с записью функций на лиспе... Есть наработки, но вроде не верные: http://s017.***********/i437/1209/c9/8e90a356da43.jpg (sqrt...

Решение функции на LISP
Помогите решить задачу во вложении. Нужно вычичислить значение функции на LISP.

Написать функции на LISP
Написать 1) функцию, которая по списку ‘(q w e r t y) строит сложный список (q (w (e (r (t (y)))))). 2) функцию, которая по...

Две функции на lisp
Здравствуйте, помогите решить две задачи на lisp: 1) Функция, которая принимает 2 аргумента список и число, функция возвратит элемент из...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru