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

Вычислить сумму, используя рекурсивую функцию common lisp

15.10.2017, 12:52. Показов 1821. Ответов 14

Студворк — интернет-сервис помощи студентам
Нужно написать рекурсивную функцию, вычисляющую данную сумму. Я не могу разобраться, как это сделать, потому что не могу представить, как без цикла должен происходит инкремент i.
И в коммон лисп вроде нельзя возвести переменную в степень переменной?
Хочу разобраться, написал сыро и наверняка белиберду, потому что не понимаю, объясните, что к чему, пожалуйста!
Название: Screenshot_203.jpg
Просмотров: 30

Размер: 2.7 Кб
Lisp
1
2
3
4
5
6
7
8
 (DEFUN summa(X N)
(COND 
  ((or (not (integerp N))
(not (numberp X))
       (<= N 0)    ) 'ERROR_IN_DATA)
 (T (COND ( (= N 1) (/ 1 1))
 ( T ( +(summa X (- N 1)
     (/ X N))))))))
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.10.2017, 12:52
Ответы с готовыми решениями:

Вывести список элементов в обратном порядке используя рекурсию (Common lisp)
Помогите решить задачу Вывести список элементов в обратном порядке через рекурсию в Common Lisp

Каким образом в Common Lisp можно возвращать более одного значения, не используя объекты-контейнеры?
Каким образом в Common Lisp можно возвращать более одного значения, не используя объекты-контейнеры?

Книги или другой источник, где описана история версий Lisp и Common Lisp
Доброго времени суток.Такой вопрос,знаете какой-нибудь источник,где описана история версий Lisp и Common Lisp.Только не всякие...

14
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38196 / 21129 / 4309
Регистрация: 12.02.2012
Сообщений: 34,737
Записей в блоге: 14
15.10.2017, 12:56
Lisp
1
2
3
(defun task (x n &optional (a x) (i 1))
  (cond ((> i n) 0)
           (t (+ (/ a i) (task x n (* a x) (+ i 1))))))
0
0 / 0 / 0
Регистрация: 24.12.2014
Сообщений: 13
15.10.2017, 13:06  [ТС]
Catstail, а можете пояснить? за что отвечает &optional?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38196 / 21129 / 4309
Регистрация: 12.02.2012
Сообщений: 34,737
Записей в блоге: 14
15.10.2017, 13:20
Признак начала списка необязательных параметров.
0
0 / 0 / 0
Регистрация: 24.12.2014
Сообщений: 13
15.10.2017, 13:25  [ТС]
Catstail, а за что отвечает переменная а?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38196 / 21129 / 4309
Регистрация: 12.02.2012
Сообщений: 34,737
Записей в блоге: 14
15.10.2017, 13:41
Переменные a i - накопительные параметры. Вот протокол трассировки (может, станет понятнее):

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
(defun task (x n &optional (a x) (i 1))
  (cond ((> i n) 0)
           (t (+ (/ a i) (task x n (* a x) (+ i 1))))))
 
 
==> TASK
(trace task)
 
==> TASK
(task 5 10)
 
Вход в функцию task Аргументы: 5 10
  Вход в функцию task Аргументы: 5 10 25 2
    Вход в функцию task Аргументы: 5 10 125 3
      Вход в функцию task Аргументы: 5 10 625 4
        Вход в функцию task Аргументы: 5 10 3125 5
          Вход в функцию task Аргументы: 5 10 15625 6
            Вход в функцию task Аргументы: 5 10 78125 7
              Вход в функцию task Аргументы: 5 10 390625 8
                Вход в функцию task Аргументы: 5 10 1953125 9
                  Вход в функцию task Аргументы: 5 10 9765625 10
                    Вход в функцию task Аргументы: 5 10 48828125 11
                    Возврат из функции task Результат: 0
                  Возврат из функции task Результат: 1953125/2
                Возврат из функции task Результат: 21484375/18
              Возврат из функции task Результат: 89453125/72
            Возврат из функции task Результат: 631796875/504
          Возврат из функции task Результат: 633109375/504
        Возврат из функции task Результат: 633424375/504
      Возврат из функции task Результат: 633503125/504
    Возврат из функции task Результат: 633524125/504
  Возврат из функции task Результат: 633530425/504
Возврат из функции task Результат: 633532945/504
==> 633532945/504
0
0 / 0 / 0
Регистрация: 24.12.2014
Сообщений: 13
15.10.2017, 13:47  [ТС]
Catstail, спасибо!
Цитата Сообщение от Catstail Посмотреть сообщение
Возврат из функции task Результат: 21484375/18
а почему деление на 18, если должно делиться на то же число, в какую степень возводится?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38196 / 21129 / 4309
Регистрация: 12.02.2012
Сообщений: 34,737
Записей в блоге: 14
15.10.2017, 13:51
Там ведь рациональные числа получаются. Дроби сокращаются.
0
0 / 0 / 0
Регистрация: 24.12.2014
Сообщений: 13
15.10.2017, 14:21  [ТС]
Catstail, тогда последний вопрос,
Цитата Сообщение от Catstail Посмотреть сообщение
(a x)
x и a в данном моменте почему написаны подобным образом? то есть
Цитата Сообщение от Catstail Посмотреть сообщение
(i 1)
тут i сопоставляется единице, а x и a?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38196 / 21129 / 4309
Регистрация: 12.02.2012
Сообщений: 34,737
Записей в блоге: 14
15.10.2017, 14:33
(a x) - первоначальное значение a равно х; (i 1) первоначальное значение i равно 1
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
15.10.2017, 14:45
Цитата Сообщение от segday Посмотреть сообщение
Хочу разобраться, написал сыро и наверняка белиберду, потому что не понимаю, объясните, что к чему, пожалуйста!
Трудно ждать чего-то от задачи, где требуется сделать через рекурсию то, что не надо делать рекурсией. Но написано не так плохо.

Цитата Сообщение от segday Посмотреть сообщение
потому что не могу представить, как без цикла должен происходит инкремент i.
Так, как вы и сделали: вместо тела цикла выступает функция, а параметры цикла (счётчики, аккумуляторы и т. п.) превращаются в параметры функции. Я пару раз писал подробно об этом, но пойди найди... Может потребоваться написать вспомогательную функцию, которая соответствует конкретному циклу. Но в CL это в любом случае плохая идея (не лучше, чем в си).

Цитата Сообщение от segday Посмотреть сообщение
И в коммон лисп вроде нельзя возвести переменную в степень переменной?
Конечно, можно ― это же CL. Функция называется expt. Работает даже с комплексными числами.

Теперь по поводу кода.

Первое ― нужно его оформить так, чтобы было читаемо. Есть определённые правила оформления кода и редакторы, умеющие эти правила. Вот:
Lisp
1
2
3
4
5
6
7
8
(defun summa (x n)
  (cond ((or (not (integerp n))
             (not (numberp x))
             (<= n 0))
         'error-in-data)
        (t (cond ((= n 1) (/ 1 1))
                 (t (+ (summa x (- n 1)
                              (/ x n))))))))
Отступы. Пробелы перед группами открывающихся скобок, после открывающейся скобки пробел не нужен. Всё маленькими буквами. Дефисы вместо подчёркиваний. У вас первое условие в cond многострочное, и по вашему тексту совершенно не видно, что оно заканчивается как раз перед 'error-in-data.

Теперь ― конкретно по содержанию.

cond ― это множественный выбор, поэтому нет смысла так вкладывать внутренний во внешний, надо было продолжать писать внешний. Впрочем, внешний cond, проверяющий типы, здесь не нужен (см. ниже).

Где написано (/ 1 1), очевидно, должно быть (/ x 1). Потом поправить рекуррентную формулу, использовав expt и поправив скобки. Видите, когда я сделал вам отступы, сразу видно, что вы в summa засовываете три аргумента, а на самом деле последний аргумент должен быть слагаемым.

По поводу проверки типов. Проверка типов ― это стильно. Она может сделать функцию более читаемой. Но, в принципе, часто её отсутствие не влечёт тяжёлых последствий. Например, вы проверяете, что x ― число. Но в теле функции вы осуществляете с ним арифметические действия, и если x не будет числом, вылетит ошибка ― то, что и должно быть. (Лучше сигнализировать ошибку вместо возвращения особого значения.) С другой стороны, проверка типа n действительно важна: если функции дадут отрицательное n, ошибки не будет, но функция зациклится (точнее, в данном случае переполнится стек вызовов).

Обычно проверку типов выполняют макросом check-type. Вместо внешнего cond напишите
Lisp
1
2
(check-type n (integer 1 *))
(check-type x number)
1
0 / 0 / 0
Регистрация: 24.12.2014
Сообщений: 13
15.10.2017, 15:35  [ТС]
Catstail, Спасибо!! понятно

Добавлено через 16 минут
helter, большое спасибо за ответ, с оформлением действительно более удобочитаемо.
Написал так, без проверки типов, считается, правда, неверно, потому что как-то надо еще учесть деление на инкремент
Lisp
1
2
3
4
 (defun summa (x n)
(cond ((= n 1) (/ X 1))
   (t (+ (summa x (- n 1))
      (expt x n)))))
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38196 / 21129 / 4309
Регистрация: 12.02.2012
Сообщений: 34,737
Записей в блоге: 14
15.10.2017, 15:37
Цитата Сообщение от segday Посмотреть сообщение
(expt x n)
- нерационально возводить в степень на каждом вызове.
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
15.10.2017, 16:36
Цитата Сообщение от segday Посмотреть сообщение
потому что как-то надо еще учесть деление на инкремент
Плюсуйте к сумме
Lisp
1
(/ (expt x n) n)


Цитата Сообщение от Catstail Посмотреть сообщение
нерационально возводить в степень на каждом вызове.
Если бы ставилась цель сделать рационально, не было бы рекурсии.
0
0 / 0 / 0
Регистрация: 24.12.2014
Сообщений: 13
15.10.2017, 18:45  [ТС]
helter, да, так сходится!спасибо, более-менее разобрался в этом
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.10.2017, 18:45
Помогаю со студенческими работами здесь

Вычислить сумму, используя рекурсивную функцию
Вычислить сумму, используя рекурсивную функцию. x=\sum_{10}^{k=1}\frac{\left|cos({k}^{2}-3,8) \right|}{4,5}-9,7sin(k-3,1)

Используя функцию вычислить сумму ряда
s=1/2*3+1/4*5+1/6*7+...1/2n*(2n+1)+...

Вычислить сумму, используя рекурсивную функцию
П.5.18.Правил Запрещено размещать задания и решения в виде картинок и других файлов с их текстом.

Вычислить сумму, используя рекурсивную функцию
\sum_{k=1}^{15} \left|sin\frac{k}{3,12}+cos{k}^{2} \right| -8,3sin3k Заранее благодарен

Вычислить сумму: 1!+2!+3!+…+n!, используя функцию вычисления факториала числа k
1. Напишите программу вычисления суммы: 1! + 2! + 3! + … + n!, используя функцию вычисления факториала числа k. С меня...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru