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

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

  1. Напишите итеративное решение на любом известном вам ЯП. Перепишите на CL с использованием loop или iterate.

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

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

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

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

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

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

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

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

Lisp вещь.

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

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

fsb4000 ★★★★★ ()
Ответ на: комментарий от 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)
Ответ на: комментарий от 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 ()
Ответ на: комментарий от saufesma

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

saufesma ()
Ответ на: комментарий от 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 ()
Ответ на: комментарий от turtle_bazon

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

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

Zhbert ★★★★★ ()
Ответ на: комментарий от 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)
Ответ на: комментарий от no-such-file

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

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

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

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

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

saufesma ()
Ответ на: комментарий от 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 ()