Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Циклы в Lisp 
V
    Опции темы
turtys
Дата 26.9.2006, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 26.9.2006

Репутация: 1
Всего: 1



Как в лисп моэжно организовывать циклы с подобный циклу for(;;) из С++, а то с DO уже намучался до невозможности не пашет и все (
PM MAIL   Вверх
Lisp2D
Дата 26.9.2006, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 8.6.2006

Репутация: нет
Всего: нет



(defmacro for ((i n) &rest tasks)
 `(do ((,i 0))
  ((>= ,i ,n))
  ,@tasks))

(for (j (length "abcd"))
 ...using j...
  (setf j (1+ j)))


Это сообщение отредактировал(а) Lisp2D - 26.9.2006, 21:12
PM MAIL   Вверх
Void
Дата 26.9.2006, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: нет
Всего: 173



Lisp2D, зачем, если есть loop?
Код
(loop for i from 1 to 10 do
    (format t "~D" i))



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
turtys
Дата 26.9.2006, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 26.9.2006

Репутация: 1
Всего: 1



РЕбят что то все рано не получаеться, на С++ набомбил но надо на лиспе
Код

#include<stdio.h>
#include<math.h>
float F(float x);
main()
{int k;
float a,b,x,y,z,L;
a=-5;
b=10;
x=(a+b)/2;
L=fabs(b-a); //Взятие по модулю
for(k=0;L>0.005;k++)
    {y=a+L/4;
      z=b-L/4;
           if(F(y)<F(x))
            {b=x;
              x=y;
              }
      else if(F(z)<F(x))
         {a=x;
                       x=z;
          }
    else {a=y;
                         b=z;
          }
                L=fabs(b-a);
}
float F(float x)
{float X;
X=x*x*x*x;
return X;
}



Пытаюсь вот это переписать на лиспе, но пока получилось вот что:
Код

(defun  F (x)
(* x x x x))

(let* ((a -5)
         (b 10)
         (xsr(/(+ a b) 2))
         (L (abs(- b a)))
         (y (+ a (/ (abs L) 4)))
         (z (- b (/ (abs L) 4))))       
  (do ((k 0 (+ k 1)))
      ((< L 0.005 (print xsr))
       (cond ((< (F y) (F xsr)) (let* ((b xsr)
                                                  (xsr y)
                                                  (L (abs(- b a))))))
                                                                    
                ((< (F z) (F xsr)) (let* ((a xsr)
                                                  (xsr z)
                                                  (L (abs(- b a))))))
                ((> (F z) (F xsr)) (let* ((a xsr)
                                                  (xsr z)
                                                  (L (abs(- b a))))))))))
И все это (я имею ввиду на лиспе) не цензура не пашет, знаний и опыта не хватает, програма должна реализовывать метод дихотомии (методы отимизации). Конечно то что я написал на лиспе может быть и полный бред ), но пока сидел разбирался пришел только к этому.Тот что на С++ реализован полность правильно, вот хотелось бы его переписать на лиспе, помогите плз.

Это сообщение отредактировал(а) Cr@$h - 26.9.2006, 22:54
PM MAIL   Вверх
Void
Дата 27.9.2006, 01:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: нет
Всего: 173



Очень интересный стиль написания кода на C++. При чтении вызывает желание застрелиться или найти автора и сделать ему… плохо.
Метод дихотомии:
Код
(defun find-minimum (f a b eps)
    (let ((d (- b a)))
        (if (< d eps)
            (* (+ a b) 0.5)
            (let* ((x (+ a (* d 0.25)))
                    (y (- b (* d 0.25)))
                    (fx (funcall f x))
                    (fy (funcall f y)))
            (cond
                ((< fx fy) (find-minimum f a y eps))
                ((> fx fy) (find-minimum f x b eps))
                (t (find-minimum f x y eps)))))))

; Пример использования: точка минимума f(x) = (x - 1)^2 на (-5; 5) c погрешностью 0.01
(find-minimum #'(lambda (x) (* (- x 1) (- x 1))) -5 5 0.01)



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
turtys
Дата 27.9.2006, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 26.9.2006

Репутация: 1
Всего: 1



to Void Спасибо тебе все работает, только не мог бы ты пояснить некоторые строчки:
 
(fx (funcall f x)) я так понял примерно что тут х подставляется в лямбда выражение которое мы пишем в вызове функции, только интересен сам механизм и что значит funcall
И еще в конце выводиться ответ, а в каком месте проги прописан вывод этого ответа?


И еще я хочу сделать прогу визуальной, и т.е. получиться должно что нибудь типо есть форма на ней кнопка и edit, мы тыркаем на кнопку а результат выводиться в edit, сейчас я попробовал, но не знаю как прописать вывод в edit и вообще ли можно так в лиспе делать. И Void как сделать что бы функция и все параметры в код были вбиты намертво, т.е. мне нужна это прога для определенной функции, и для определенный остальных значений, т.е. погрешность и a и b все задано, как их вбить что бы не надо было каждый раз их вводить, а просто тыркали на кнопку и результат выводился в едит?

Для кнопки я прописываю вот так для примера :

Код

(defun form1-button4-on-click (dialog widget)
  (declare (ignore-if-unused dialog widget))
  
(car '(a b c))

  t)
 Я в правильном месте пишу код? Если да то как результат вывести в едит? 


Это сообщение отредактировал(а) turtys - 27.9.2006, 18:48
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума LISP
Void
  • Пожалуйста, создавайте темы с содержательными названиями.
  • Lisp — это целое семейство языков. Всегда указывайте в теме используемый диалект (Common Lisp, Scheme и т.д.).
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | LISP | Следующая тема »


 




[ Время генерации скрипта: 0.1128 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.