LINUX.ORG.RU

lisp, сумма ряда

 


0

2

Доброго времени суток. Получил задание - посчитать сумму ряда. Ну, думаю, все просто. Ряд 3.14*n!. Взял рекурсивную функцию расчета факториала, объявляю стандартную конструкцию цикла со счетчиком, получаю ошибку «unbound function - I». Саму конструкцию взял с мануала. ЧЯДНТ?

(defun fact (n)
	(
		if (zerop n)
			3.14
		(* n (fact (1- n)))
	)
)
 
(defun sum (n)
	(
		loop for i from 1 to n 
		summing (fact (i))
	)
)


Скобки расставь по-человечески, блин! И вокруг i убери, почитай что ли как функции вызываются в лиспе. Ну и я не очень понял сумму как тебе надо посчитать,

\sum\limits_{n=0}^n 3{,}14n! = 3.14 \cdot \sum\limits_{k=0}^n n!
так что ли?

Artificial_Thought ★★★★
()

summing (fact (i))

Жесть.

А вообще, это пишется в одну простую функцию.

Да и i — не функция.

buddhist ★★★★★
()
Ответ на: комментарий от Artificial_Thought

Скобки расставь по-человечески, блин!

Прошу извинить, но это единственный способ мне что-то разбирать на таком синтаксисе.

И вокруг i убери, почитай что ли как функции вызываются в лиспе.

Убрал скобки, результат тот же. Насчет «почитать побольше» - я два часа назад свой первый hello world попробовал.

Суммируются значения факториала*3,14. Посему вызывается функция расчета факториала, ее результат суммируется в цикле. Ну, должен суммироваться, я-то созерцаю ошибку.

sudo-s
() автор топика
Ответ на: комментарий от Bad_ptr

Да знаю. Мне нужен скриншот работающей проги для отчета и обязательно в вендовом xlisp. Там нет ни табуляции, ни подсветки синтаксиса... Пробую писать так, чтобы хоть отдаленно что-то видеть.

sudo-s
() автор топика
Ответ на: комментарий от Artificial_Thought

Да уже написано, и схему рекурсивных вызовов нарисована, весь код собран из кусков примеров из хендбука, но какая-то идиотская ошибка не пойми откуда появляется.

sudo-s
() автор топика
Ответ на: комментарий от Artificial_Thought

не совсем. ряд у меня пи*к!. факториал высчитывается рекурсивно, как только вызов происходит с параметром нуля, вместо 1 он вернет 3.14. Для любого параметра вызова этой функции семантика верная.

sudo-s
() автор топика
Ответ на: комментарий от sudo-s

Убрал скобки, результат тот же.

Что значит «тот же»? У тебя ошибка показанная связана с тем, что ты скобки вокруг переменной поставил, если их убрать, всё начинает работать.

Reaper ★★
()
Ответ на: комментарий от Reaper

Пардон, имел в виду, что проблема осталась: «Unbound function» сменился на «Unbound variable». На шаг ближе к цели, но все же пока не работает.

sudo-s
() автор топика
Ответ на: комментарий от Reaper

Для меня тоже было сюрпризом узрить ошибку в примере кода из самоучителя. Стало быть, убогий виндовый транслятор творит чудеса. Спасибо за помощь.

sudo-s
() автор топика

какой прекрасный пример программирования не приходя в сознание.

если тебе нужна сумма ряда от а до б или сумму значений функции от х в границах от а до б ( т.е арифмитический интеграл)

то может стоит запрогать рекурсию в любую стороно к одной из границ от другой а в третьей-акомуляторе гонять накопленную частичную.

индуссов итак милиард - зачем?

qulinxao ★★☆
()
Ответ на: комментарий от qulinxao

то может стоит запрогать рекурсию в любую стороно к одной из границ от другой а в третьей-акомуляторе гонять накопленную частичную.

Это будет на следующей лекции, вместе с TCO.

baverman ★★★
()
Ответ на: комментарий от baverman

Tail Cail Optimization?

рекурсия и указатели(имя и именуемое как различные произвольно связаные сущьности) — имхо это начальные фильтры - если ими не фильтровать лемингов на CS - то вместо классного образования получаем очередное заборостроительное

qulinxao ★★☆
()
Ответ на: комментарий от qulinxao

Тут соль в том, что надо вызов функции из функции, посему такие требования к реализации и соответствующие задания. Сначала надо было организовать рекурсивный рассчет факториала, а теперь - модифицировать программу. Простые учебные примеры с постепенным усложнением структуры программы.

sudo-s
() автор топика
Ответ на: комментарий от qulinxao

вместо классного образования получаем очередное заборостроительное

Вы недалеки от истины

sudo-s
() автор топика
Ответ на: комментарий от sudo-s

вот и прекрассно

так как лисп в отличии от() позволяет передавать имя функции то

и пишеш отдельный суматор- интегратор который одним из аргументов принимает лябмбду/уже_похаченый_тобой_фак

и получаеш на выходе функциюсуматорсвоегопифака.

модифицировать_специализировать не нужно.

модифицироваьт_расширять апи - добавлять в сумматор приём произвольной функции вот это дело .

qulinxao ★★☆
()

Зачем на каждой итерации считать факториал?

(defun sum (n)
  (iter (for i from 1 to n)
        (multiply i into term)
        (summing (* term pi))))
theNamelessOne ★★★★★
()
Ответ на: комментарий от sudo-s

Мне нужен скриншот работающей проги для отчета и обязательно в вендовом xlisp

Он же умер, не?

Почему-то среди вузовских преподавателей сильно распространена некрофилия.

Мне нужен скриншот работающей проги для отчета и обязательно в вендовом xlisp. Там нет ни табуляции, ни подсветки синтаксиса...

А если набрать сам код в нормальной редакторе и запустить его в xlisp'е?

theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne

Он же умер, не?

Ну, только там возникает ошибка при запуске

А если набрать сам код в нормальной редакторе и запустить его в xlisp'е?

Набирал в notepad++, копировал. Табуляция сохраняется, но подсветка слишком футуристична для такой «студии».

sudo-s
() автор топика
Ответ на: комментарий от sudo-s

Ну такое вот задание

Угу, уже увидел. Кстати, можно еще сделать, как посоветовал наш косноязычный друг: кажется, я понял, что он имел в виду.

theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne

? :)

 (defun pifactorial (n) (cond ((eq 0 n) 3.1415926)(t (* (pifactorial (- n 1)) n))))

 (defun AsigmaB (a b f) (cond ((> a b)0) (t (+ (funcall f a) (AsigmaB (+ a 1) b f) ) ) ))


 (defun main(a b) (asigmab a b 'pifactorial))
qulinxao ★★☆
()
Ответ на: комментарий от theNamelessOne

У меня в дуалбуте убогенькая едва живая. Единственная ее задача - 10-15 раз в семестр запускать мне maple/netcracker/etc только для выполнения лаб. Соответственно, система и чувствует себя аналогично: ntfs давно сыпется, реестр загажен, трей на полширины экрана забит левыми агентами каких-то программ, о которых я и не слышал. В этом болоте дольше 10 минут находиться не хочется, софт (какой бы то ни было) устанавливается только по двум принципам: «ну раз обязательно эта прога, обязательно под венду...» и «ну раз аналога у меня еще нет...». Пускай умирает сама под собственным весом.

sudo-s
() автор топика
Ответ на: ? :) от qulinxao

Угу, примерно так я и понял.

theNamelessOne ★★★★★
()
Ответ на: ? :) от qulinxao

Ну в целом я примерно то же и получил, только не прибегая к cond (о котором я узнаю только 2 работы спустя). Тут вопрос стоял не в том, как написать, а в том, откуда вылезает ошибка необъявленной переменной. Такой метод (а теперь возьмем исходник прошлой программы и сделаем его по людски) я встречал уже у Р.Лафоре (ООП В С++). Ввиду чего не предполагается «чудесного перевоплощения» программы из быдлокода в чудо-систему, а лишь постепенная многократная модификация (учитывая, КТО эту прогу пишет, ей вообще не суждено избавиться от идентификатора «быдлокод»).

sudo-s
() автор топика
Ответ на: комментарий от sudo-s

http://c2.com/cgi/wiki?HowToSumFromOneToTenInLispOrScheme

cl не учебный язык - оно просто не для этого ( оно для промышленности)

тот же funcall не чисто

не понятно - ты дебажиш свою методичку по комон лиспу для дальнейшего преподавания среди лемингов либо это чьи ?

ps. cond cose lisp== cond+car+cdr+cons+apply|eval+eq

qulinxao ★★☆
()
Ответ на: комментарий от qulinxao

Я штудирую методичку с одной лишь целью: доделать лабы, сдать, получить в зачетку автограф и забыть его вместе с прологом как страшный сон и вернуться к плюсам и перлу. Просто иногда не нравится реализация очередного hello world'a, тогда находится другой исходник, если он не противоречит заданию, потому как сразу сделать «классненько» нельзя.

sudo-s
() автор топика
Ответ на: комментарий от qulinxao

Единственная возможность поднять денег (не то что бы разбогатеть) в нашем Столлманом забытом городишке - это веб. Perl CGI, html_template, написание мегакрутой CMS... В приложении к человеку, который без мануала софт собирает из исходников с 10й попытки - это го_носайтики левых фирмочек. Иначе никак. Благо, есть еще овер9000 аппаратуры, которую нужно перепаять не за спасибо, куча автомобилистов, жаждущих покрасить своё тазище или кто открывает капот только за «залить водички». Но всё это тлен, а программирование - оно для души.

sudo-s
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.