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
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.