LINUX.ORG.RU

Не могу написать код по заданному алгоритму

 ,


2

5

Граждане и гражданки ЛОР не дайте свихнуться, а дайте код на Lisp или Scheme

у меня два списка (а1 а2 а3 ... an) (Р0 Р1 Р2 ... Pn)

в первом проходе получаю списки (а1) (Р0) и решение такого ур-ия

M1 = P0 * a1

в втором проходе получаю списки (a1 a2) (P0 P1) и решение такого ур-ия

M2 = P0 * a2 + (P1 * (a2 - a1))

в третьем проходе плучаю списки (a1 a2 a3) (P0 P1 P2) и решение такого ур-ия

M3 = P0 * a3 + (P1 * (a3 - a1) + P2 *(a3 - a2))

ну и т.д.

Общее уравнение

 i
 Mn = P0 * an + ΣPi * (an - ai)
 i=1

мозги колом встали

★★

Последнее исправление: saufesma (всего исправлений: 2)
  1. Напишите итеративное решение на любом известном вам ЯП. Перепишите на CL с использованием loop или iterate.

  2. Напишите рекурсивное решение на любом известном вам ЯП. Перепишите на схеме.

P.S. А с «дайте готовое решение» вы разделом ошиблись.

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

А, что в этом разделе все такие слабенькие, что код по алгоритму не накидают? А ещё пять звёзд, и кто вам их даёт?

saufesma ★★
() автор топика
Последнее исправление: saufesma (всего исправлений: 3)
Ответ на: комментарий от saufesma

Вангую он думает что тебе лабу надо решить.

Интересно, существуют ли среды или языки позволяющие просто загнать «Mn = P0 * an + ΣPi * (an - ai)» и не писать алгоритмов?

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

Вангую он думает что тебе лабу надо решить.

Ученические лабы далеко в прошлом, а в сегодняшнем дне делаю лабы чтобы проверить свои считалки, чтобы потом в изделии ничего не про-ать.

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

Lisp вещь.

Lisp может быть и вещь, но тогда скачай/купи какой-нибудь учебник по Lisp и начинай читать. Через какое-то время и поймёшь как там делаются циклы, массивы, и прочее…

Смысл спрашивать на лоре? Так ты не узнаешь Lisp/Scheme, даже если кто-нибудь скинет тебе решение.

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

ты еще McCLIM используешь?

давно сдулся, хотя и зря, нравился он мне. Правда под нажимом опытных товарищей стал изучать ракет.

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

Не от языка это зависит. Накидай мне на своём языке, а я попробую разобраться.

Писал на лоре, ничего не проверял, но вроде похоже на

Mn = P0 * an + ΣPi * (an - ai)
double aux(double const* p, double const* a, size_t const n)
{
  double result = 0.0;
  for (size_t i = 1; i < n; ++i)
  {
    result += p[i]*(a[n]-a[i]);
  }
  return result;
}

void  solve(size_t const n, double const* a, double const* p, double* m)
{
  for(size_t i = 1; i < n; ++i)
  {
    m[i] = p[0]*a[i] + aux(p, a, i);
  }
}
fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 1)

мозги колом встали

Приведите уже написанный нерабочий код

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

примерно такое же,

(defvar *dist-lst* '())
(defvar *force-lst* '())
(defvar *first-member* '())
(setq *first-member* '())
(setq *dist-lst* '(5 7 9))
(setq *force-lst* '(10 20 30))

(defvar *lst-in*)
(setq *lst-in* '(1 2 3))
(defvar *lst-store)
(setq *lst-store* '())

(defun car-lst (lst)
  (car lst))

(car-lst *lst*)
					;(car (reverse '(1)))
(defun list-of-store (lst-in lst-store)
      (list (car-lst lst-in) lst-store))

(list-of-store *lst-in* *lst-store*)
(append *lst-store* (setq *lst-store* (cons 1 '(2))))
(defun mul (force-lst dist-lst)
  (if (null dist-lst)
  *first-member*
   (progn
  (push (* (car force-lst)
	   (car dist-lst)) *first-member*)
  (mul force-lst (cdr dist-lst)))))

(reverse (mul *force-lst* *dist-lst*))

					;теперь нахожу (a(n) - a(i)

(defvar *reverse-dist-lst*)
(setq *reverse-dist-lst* (reverse *dist-lst*))
(defvar *last-member*)
(setq *last-member* (car *reverse-dist-lst*))
(defvar *cdr-reverse-dist-lst*)
(setq *cdr-reverse-dist-lst* (cdr *reverse-dist-lst*))

(defvar *an-ai*)
(setq *an-ai* '())

(defun subtract (num lst)
  (if (null lst)
      *an-ai*
      (progn
	(push (- num (car lst))
      *an-ai*)
	(subtract num (cdr lst)))))

(subtract *last-member* *cdr-reverse-dist-lst*)

;ну и Pi * (a(n) - a(i))
(defvar *cdr-force-lst*)
(setq *cdr-force-lst* (cdr *force-lst*))
(defvar *rest-of-forces*)
(setq *rest-of-forces* '())

(defun m-force (lst1 lst2)
  (if (null lst1)
      *rest-of-forces*
    (progn
      (push (* (car lst1)
	       (car lst2))
	    *rest-of-forces*)
      (m-force (cdr lst1) (cdr lst2)))))

(m-force *cdr-force-lst* *an-ai*)
saufesma ★★
() автор топика
Ответ на: комментарий от fsb4000

Тоже на ЛОРе накидаю...

(defun aux (p a n)
  (len ((result 0.0))
    ((loop for i from 1 to n do 
      (setf result (+ result (* (- (nth n a) (nth i a)) (nth i p)))))
    result))

(defun solve (n a p m)
  (loop for i from 1 to n do
    (setf (nth i m) (+ (* (car p) nth i a) (aux p a i)))))

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

сомневаюсь что это запустится.)) Это не главное, там идея на лиспе.

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

А, что в этом разделе все такие слабенькие, что код по алгоритму не накидают? А ещё пять звёзд, и кто вам их даёт?

В этом разделе не принято просить решить задачу за тебя. Посмотреть твое решение и подсказать ошибку - пожалуйста. Поучаствовать в дискуссии о выборе алгоритма - не вопрос. Решить за тебя - нет.

Выбери один из двух ваниантов, пожалуйста:

  • Пишешь решение сам, описываешь, что не получается. Мы смотрим, подсказываем.
  • Обозначь сумму, которую готов отдать за решение. Тему переношу в Job .
Zhbert ★★★★★
()
Ответ на: комментарий от paramon

Интересно, существуют ли среды или языки позволяющие просто загнать

Да, маткад.

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

Решить за тебя - нет.

Так не пойдет.

Алгоритм мой, общее мат выражение моё. Что и кто за меня решает? Я просто свой алгоритм не смог переложить на ЯП вот и всё.

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

Пишешь решение сам

Оно написано.

Обозначь сумму, которую готов отдать за решение.

А, что там решать? Там всё решено, там на ЯП не уложено.

saufesma ★★
() автор топика
Последнее исправление: saufesma (всего исправлений: 1)
Ответ на: комментарий от saufesma

Т.е. тебе за изделие платят ЗП (ну или ты его продаёшь сам и получаешь лавэ), а тут тебе написать должны за просто так? Неплохо.

peregrine ★★★★★
()

Я алгоритм не понял. Можешь накидать с реальными списками? Непонятно что за проходы, например.

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

Молодчага, что затронул

тебе за изделие платят ЗП

нет, изделие делаю сам,

ты его продаёшь сам и получаешь лавэ

мимо, тратил лавэ на книжки от 3000 - 4000 каждая, плюс поиск этих книжек, теперь трачу на лабы.

а тут тебе написать должны за просто так? Неплохо.

с этим никто не обозначался.

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

Там всё решено, там на ЯП не уложено.

То есть ты предлагаешь написать за тебя программу, я тебя верно понял?

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

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

turtle_bazon ★★★★★
()
Ответ на: комментарий от turtle_bazon
(a1 a2 a3)            (P0 P1 P2)
(50 120 170)          (100 100 100)

(a1) (P0)
M1 = P0 * a1

в втором проходе получаю списки 
(a1 a2) (P0 P1) 
и решение такого ур-ия

M2 = P0 * a2 + (P1 * (a2 - a1))

в третьем проходе плучаю списки 
(a1 a2 a3) (P0 P1 P3) 
и решение такого ур-ия

M3 = P0 * a3 + (P1 * (a3 - a1) + P3 *(a3 - a2))

под проходом я имел ввиду исполнение одного блока кода, во втором проходе исполняется этот же блок но с изменёнными списками, так понятно, там вверху я свой корявый код поместил, если, что.

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

языки позволяющие просто загнать «Mn = P0 * an + ΣPi * (an - ai)» и не писать алгоритмов?

Maxima же. Она и на лиспе, кстати.

no-such-file ★★★★★
()
Ответ на: комментарий от Zhbert

То есть ты предлагаешь написать за тебя программу, я тебя верно понял?

Там речь идёт максимум о snippet. В обсуждениях такие вещи пишут сплошь и рядом.

saufesma ★★
() автор топика

два списка

А в чём смысл именно списков? Почему нельзя использовать vector? В любом случае у тебя там какие-то дикие выкрутасы с car, reverse и т.п. Не надо умничать, выкинь всё это и пиши с elt «как в Си».

no-such-file ★★★★★
()
Ответ на: комментарий от turtle_bazon

Если ты смотрел за темами гражданина

Нет. Зашел в трекере, там «Напишите за меня!». Хотел снести, но сначала решил просмотреть. И правда «Напишите за меня». Ну раз уж тут начали писать за него - пожалуйста.

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

ты еще мамке поди пожалуйся.

она не при делах. Просто так всё зачесалось, хорошо что на 3-ем исправлении остановился.

saufesma ★★
() автор топика
Ответ на: комментарий от no-such-file

Не надо умничать, выкинь всё это и пиши с elt «как в Си».

Умничать у меня нет никакого желания, а вот как писать с elt да ещё как в С, я понятия не имею.

Догадываюсь, алгоритм надо переписывать?

saufesma ★★
() автор топика

я не знаю лисп и хз как сделать в лиспе a[i], поэтому написал в псевдокоде, разберёшься

m(n) = a[n]*sum(p[:n+1]) - sum(a[1:n+1]*p[1:n+1])

for n=1..N:
  M[n] = m(n)
  mutate(a)
  mutate(p)

на лиспе это будет что-то типа (с точностью до ±1 и !!~nth)

m n = (a !! n) * (sum (take n p)) - (sum (drop 1 (take n (zipWith (*) a p))))
anonymous
()
Ответ на: комментарий от saufesma

как писать с elt да ещё как в С, я понятия не имею.

Примерно так, если я всё правильно понял

(defun m (a p n)
  (loop
    with an = (elt a n)
    for i from 0 to (1- n)
    sum (* (elt p i) (- an (elt a i))) into s
    finally (return (+ s (* an (elt p i))))))

(defun solve(a p)
  (loop
    with last = (1- (length a))
    for n from 0 to last
    collect (m a p n)))
no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от saufesma

Это код, готовый. Только там косяк

an нужно на p0 же умножать.

(defun m (a p n)
  (loop
    with an = (elt a n)
    for i from 0 to (1- n)
    sum (* (elt p (1+ i)) (- an (elt a i))) into s
    finally (return (+ s (* an (elt p 0))))))
no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Я таких кодов на лисп никогда не видел, у меня слов нет, у меня глаза из орбит вылезли и дух перехватило.

Вот ввод с результатом

(solve (50 120 170) (100 100 100)) (5000 19000 34000)

руками результат еще не проверял.

Мне бы тоже так хотелось, есть какие-нибудь варианты?

saufesma ★★
() автор топика
Ответ на: комментарий от no-such-file

Слушай ну давай чего-нибудь придумаем, я тоже так хочу. Верный ввод такой

(solve ’(50 120 170) ’(100 -100 -100))

(5000 5000 0)

отпад.

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

А, что в этом разделе все такие слабенькие

Давненько меня на слабо не пытались взять.

ugoday ★★★★★
()
Ответ на: комментарий от no-such-file
(defun m (a p n)
  (loop
    with an = (elt a n)
    for i from 0 to (1- n)
    sum (* (elt p (1+ i)) (- an (elt a i))) into s
    finally (return (+ s (* an (elt p 0))))))

не пойму как это работает HyperSpec имеет только loop и elt

with

for

sum

collect

into

там не значатся, как?

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