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)

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

В этом посте я вижу, как минимум, пять ошибок в двух местах.

Будте добры указать.

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

Программист должен быть очень внимательным и педантичным. До занудства. Очень важно понимать значение слов и правильно их употреблять. (Была мысль написать на эту тему статейку на Хабр, но он скатился в полное гавно.) На ЛОРе была тема, где автор написал функцию, затем вторую вдвое длиннее, и заявил, что вторая лаконичнее первой. Когда ему стали объяснять значение слова «лаконичный», он ответил: «не придирайтесь к словам, и так поняно». Сюда же относятся: набивший оскомину «эпицентр», «пандемия» по отношению к ковид-19. Ранее: «я не знаю как это по русски» от «программиста» для которого русский родной. И т.п. Подобные люди не имеют способностей к программированию Зачем мучиться, если заведомо точно не получится?

.

И по спискам

(a0 a1 a2 ... n) (P0 P1 P2 ... n)

Есть обоснованное подозрение, что здесь две ошибки: оба списка заканчиваются числом n. Думаю, что правильный вариант: (a0 a1 a2 ... an) (P0 P1 P2 ... Pn).

В каждом конкретном языке программирования все массивы должны начинаться с одинакового индекса. Математики предпочитают начинать с единицы, программисты с нуля, кто-нибудь может предложить чтобы индексация начиналась с 5 или -273, но все массивы должны начинаться с одинакового индекса. Следовательно, переписываем все формулы из шапки темы:

M0 = P0 * a0
M1 = P0 * a1 + P1 * (a1 - a0)
M2 = P0 * a2 + P1 * (a2 - a0) + P2 * (a2 - a1)
M3 = P0 * a3 + P1 * (a3 - a0) + P2 * (a3 - a1) + P3 * (a3 - a2)

.

исправляюсь

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

в том посте было чуть по другому (который раз повторяю - важна каждая мелочь):

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

С учетом того, что n используется для указания длины списка, то для произвольного элемента в формуле стоит использовать другую букву, например k.

               i=k
Mk = P0 * ak +  Σ  Pi * (ak - ai-1)
               i=1

.

Лисп - очень простой язык. Потому записываем формулу «как есть» и подсовываем ей массивы, в которых данные подобраны так, чтобы все разности, произведения и суммы были бы уникальными, и проверяем тестовые результаты (меняем k от 0 до 3). Например, для М2:

CL-USER> (let* ((a '(1 10 100 1000))
                (p '(2 3 4 5))
                (k 2)
                (a.k (nth k a)))
           ;; собственно формула
           (+ (* (first p) a.k)
              (loop :for i :from 1 :upto k
                    :for p.i :in (rest p)
                    :for a.i-1 :in a
                    :sum (* p.i (- a.k a.i-1)))))
857
CL-USER> 

И оформляем все в функцию, возвращающую массив М. Для красоты массив Р поделен на Р0 и массив Р без первого элемента.

(defun saufesma (a p)
  (loop :with p.0 := (first p)
        :with p.rest := (rest p)
        :for k :upto (1- (length a))
        :for a.k :in a
        :collect (+ (* p.0 a.k)
                    (loop :for i :from 1 :upto k
                          :for p.i :in p.rest
                          :for a.i-1 :in a
                          :sum (* p.i (- a.k a.i-1))))))

В loop в качестве ключевых слов лучше использовать кейворды. ЛОРовкая подсветка лиспа странновата, но на рисунке видно, что подсветка помогает понять структуру loop. (картинка сверху не обрезана, но лень перезаливать).

Результат:

CL-USER> (saufesma '(1 10 100 1000) '(2 3 4 5))
(2 47 857 13457)
CL-USER> 

И всего-то надо было внимательно записать условия. А если постоянно отмазываться «тут я поторопился», «да казалось и так понятно», то оставь программирование. Короче: «не хочешь срать, не мучай жопу.»

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

Так что этот пост скорее не для тебя

Я люблю такое читать, а с ошибками, нет слов, не простительно. Вы знаете как использовать loop, я бы купил Ваш tutorial on loop. Если печатались, дайте список Ваших статей/книг. Спасибо.

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

Лисп - очень простой язык.

(defun list< (N L)
; Makes a copy of list L
; containing only elements
; that are < N.
; L must be a list of numbers.
(if (null L)
nil
(if (< (first L) N)
(cons (first L) (list< N (rest L)))
(list< N (rest L)))))

CL-USER> (list< 4 '(1 2 3 4 5))
(1 2 3)
CL-USER> (list< 0 '(1 2 3 4 5))
NIL
CL-USER> (list< 2 '(1 2 3 4 5))
(1 2 3 4)
CL-USER> (list< 2 '(1 2 3 4 5))
(1)

ни на loop ни на do, я не могу переписать этот код. А переписать надо так как использование рекурсии в Лисп имеет ограниченный характер, надо использовать итерацию.

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

… А переписать надо …

Если бы было надо, ты бы прочитал ПиСиэЛь, как тебе советовал угодей. Все что есть в моем посте, описано в этой книге. Там даже больше.

А этот пример даже смотреть не буду - ты ничему не учишься (

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

Все что есть в моем посте, описано в этой книге. Там даже больше.

OK I will check it out. Sounds promising then it is in real most probably.

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

Если бы было надо, ты бы прочитал ПиСиэЛь, как тебе советовал угодей.

На этих примерах явно не понятно как из рекурсии делать итерацию.

(loop
for item in list
for i from 1 to 10
do (something))

(loop for i upto 10 collect i)

(loop for i downto -10 collect i) ; wrong

is undefined. Instead, you need to write this:

(loop for i from 0 downto -10 collect i)

(loop for i in (list 10 20 30 40) collect i)

(loop for i in (list 10 20 30 40) by #'cddr collect i)

(loop for x on (list 10 20 30) collect x)

(loop for x on (list 10 20 30 40) by #'cddr collect x)

(loop for x across "abcd" collect x)

(loop for k being the hash-keys in h using (hash-value v) ...)
(loop for v being the hash-values in h using (hash-key k) ...)

(loop repeat 5
for x = 0 then y
for y = 1 then (+ x y)
collect y)

(loop for (a b) in '((1 2) (3 4) (5 6))
      do (format t "a: ~a; b: ~a~%" a b))

(loop for (item . rest) on list
do (format t "~a" item)
when rest do (format t ", "))

(loop for i in *random*
counting (evenp i) into evens
counting (oddp i) into odds
summing i into total
maximizing i into max
minimizing i into min
finally (return (list min max total evens odds)))

(loop for i from 1 to 10 do (print i))

(loop for i from 1 to 10 when (evenp i) sum i)

(loop named outer for list in lists do
(loop for item in list do
(if (what-i-am-looking-for-p item)
    (return-from outer item))))

(if (loop for n in numbers always (evenp n))
    (print "All numbers even."))

А здесь, прямое указание на метод научного тыка

The named clause, if any, must be the first clause.
After the named clause come all the initially, with, for, and repeat clauses.
Then comes the body clauses: conditional and unconditional execution,
accumulation, and termination test.
End with any finally clauses.

The LOOP macro will expand into code that performs the following actions:

• Initializes all local loop variables as declared with with or for clauses as well as those
implicitly created by accumulation clauses. The initial value forms are evaluated in the
order the clauses appear in the loop.
• Execute the forms provided by any initially clauses—the prologue—in the order they
appear in the loop.
• Iterate, executing the body of the loop as described in the next paragraph.
• Execute the forms provided by any finally clauses—the epilogue—in the order they
appear in the loop.

ну и куда лепить совет угодайки.

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

Лиспа не знаю, могу накидать код на эрланге. Если объяснишь, что в твоём случае номер прохода? Какой результат ожидаешь в результате всех проходов? Некую матрицу вида:

(((а1) (Р0) M1) ((а1 а2) (Р0 Р1) M2) ((а1 а2 а3) (Р0 Р1 Р2) M3) … ((а1 а2 а3 … an) (Р0 Р1 Р2 … Pn-1) Mn))

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

Это канал в телеге.

А зачем канал? Там нет никого.

Сегодня попробовал стать участником lisper.ru, письмо с регистрации так и не пришло.

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

Я, как минимум, точно есть.

Это хорошо, но сейчас у меня нет возможности пользоваться телефоном. А по e-mail запросто.

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

Нажимаю Blogger и мой ящик вылазит, мне такое не нравится. Давай мыло.

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

Я пытался зарегистрироваться, значит моё мыло там на сайте где-то, отпишись и делов то.

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

А ты мой лоровский профиль смотрел?

Не подумал.

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

я бы так переделал

(defn sum
  [n as Ps]
  (reduce (fn [sum i]
            (->> (nth as i)
                 (- (nth as n))
                 (* (nth Ps i))
                 (+ sum)))
          0
          (range 0 n)))

(defn M
  [as [P0 & Ps] n]
  (let [a (nth as n)]
    (+ (* P0 a)
       (sum n as Ps))))

(defn Ms
  [as Ps]
  (map-indexed (fn [i _]
                 (M as Ps i))
               as))
anonymous
()
Ответ на: я бы так переделал от anonymous

или даже так

(defn M
  [as [P0 & Ps] n a]
  (+ (* P0 a)
     (sum n as Ps)))

(defn Ms
  [as Ps]
  (map-indexed (partial M as Ps) as))
anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.