argon bulletin board

Експертно търсене  

Новини:

Регистрирането на нови потребители е временно деактивирано.

Автор Тема: логическо и функционално програмиране  (Прочетена 20090 пъти)

;-)

  • Гост
логическо и функционално програмиране
« Отговор #20 -: 10.12.2004, 14:52:00 »

Към Phyz - малко се отплеснах - идеята не беше да покажа предимство на С компилаторите.
За Nikolay - идеята е интересна, но не съм сигурен дали няма за някои n да има проблем с представянето на реални числа. Ако можеш да провериш за всяко n от 1 до 2000000000 и да изписва само тези които са точни степени би било интересно да се види резултата. Иначе се радвам че и ти се включи, за да дадеш такава насока на разсъждение.
Всъщност доколкото мога да се сетя има само още съвсем минимална възможност за подобрение. Нямам предвид козметики, а избягване на реални числа.
Активен

Nikolay

  • Неактивен Неактивен
  • Публикации: 62
логическо и функционално програмиране
« Отговор #21 -: 10.12.2004, 16:14:00 »

Privet, otnovo!

Za greshkata si prav, ponezhe ln(1 + 2^(-k) ) kloni mnogo
byrzo kym nula. Naj-opasni sa chislata v "blizost" do 2^k.
Eto edna modifikaciq:

program check_1;

var
    n:longint;
 
begin
    writeln("n=");
    readln(n);
       
 if  2^( trunc( Log(n)/Log(2) ) )-n=0
  then writeln("true")
  else writeln("false")
                     
end.

Neka n=2^k +r, r<2^[k/t] (t e est. parametyr opisvasht opasnata zona, mozhe
da se izchisli!).
Togava [Log_2(n)], pri golemi k  e  k (priemame, che sme poluchi mashinna nula).
(Predstavi si Log_2(2^k +1), pri k=500)
togava 2^k -(2^k +r)=-r, razlichno ot nula.
Tuka izpolzvam slednoto prosto svojstvo:
2^[Log_2(n)] - n = 0 <=> n e stepen na 2, kydeto
  • e funkciqta skobka x,

a Log_2(n) e logaritym pri osnova 2.

Izvinqvam se, che postyt mi e s latinsko pismo, no ne mozhah da kiriliziram
Solaris-a si.

S pozdrav:
Nikolay D.

[This message has been edited by Nikolay (edited 10-12-2004).]
Активен
Nikolay D.

;-)

  • Гост
логическо и функционално програмиране
« Отговор #22 -: 10.12.2004, 16:32:00 »

Според мен това решение е по-близо, но се появява допълнителен проблем - ако приемем в първия вариант Log(n)/Log(2) не се изчислява два пъти това е еквивалентно на: frac(X) = X - trunc(X). Проблема е в допълнителното повдигане на степен, което не е толкова тежко когато е целочислено и е степен на 2, но все пак е по-неефективно.
Активен

Phyz

  • Гост
логическо и функционално програмиране
« Отговор #23 -: 10.12.2004, 16:50:00 »

Леле... абе хора вий друга работа нямате ли си  
Активен

Nikolay

  • Неактивен Неактивен
  • Публикации: 62
логическо и функционално програмиране
« Отговор #24 -: 10.12.2004, 20:09:00 »

quote:
Originally posted by Phyz:
Леле... абе хора вий друга работа нямате ли си  :)



Здравейте, Phiz !
Поне аз имам работа в изобилие. В понеделник тряба да предадем проектите си (4 задачи за BCH-Codes), но този път лекторът надмина себе си -
задачите са зверски. Явно си прави някакви експерименти. Решил съм само 2.
Ако някой е чел сериозно BCH-Codes, да пише (в темата Алгебра).

Поздрави
Nikolay D.
Активен
Nikolay D.

Райчо Мукелов

  • Неактивен Неактивен
  • Публикации: 486
  • I snuggle with subwoofers
    • HULTIG - Human Language Technlogy and Bioinformatics Interest Group
логическо и функционално програмиране
« Отговор #25 -: 11.12.2004, 14:18:00 »

Направих няколко експеримента - на Николай вариантите и двата работят при мен, но само ако логаритмите са десетични с натурални явно поради някакви грешки при изчисляването на натурален логаритъм с библиотеката на C още на 8 дава неверен резултат. Другото което е интересно итерационния вариант работи поне 5 пъти по-бързо (за по-големи числа още повече) - изглежда е така защото няма работа с реални числа.

[This message has been edited by sasquatch (edited 11-12-2004).]
Активен

JOKe

  • Неактивен Неактивен
  • Публикации: 2656
  • Code or Die
логическо и функционално програмиране
« Отговор #26 -: 11.12.2004, 15:43:00 »

samo iskam da kaja che nqamam nishto protiv LIsp / Prolgo mislq che prosto miastoto ne im e v 3ti kurs a i otdelno pone kato sa slojeni v 3ti kurs pone da uchim interesni neshta primerno v referance-a na NewLISP zabelqzah ludi raoti primerno socket clienti i etc  
kolkoto do Java i C# ... kvo losho ima v tova da rabotish i da se napivash sqaka vecher s bira primerno   a i kolkoto "da si pishehs programi za koito naistina ti pravi kef" ami moga da ti kaja che kato pisha na java naistina mi e kef a kato pisha na C++ ( tupata bibliteka na microsoft ( MFC 6.0 ) .. male as sanuvam koshmari i posle nemgoa da se orientiram zakvo stava vapros da ne goovrim che Microsoft Press edna hubava kniga nqamat se edno gi izbirat po nekadyrnost.
ideqta mi e che moje bi hubavo v 1vi krus da se uchi C++ .. kakto si e sega dobre neka tama da ima nqakvi bazovi znaniq i da sme vijdali ot sichki ama posle 2ri kurs i 3ti mesto da seu chat neshta kato Lisp i Prolog ( po novata programa ima i Ezici za programirane kadeto ima osnovi na Lisp i Prolog ) t.e. gubim veche 1 semstar mojeshe da se sipe iako Java i C# a
apak mi e pisnalo ot izkazvaniq che horata deto pishat na C# i Java ne sa programisti ..   nachi tova che pishem/pishat na udobni ezici izmisleni na baza drugi ezici e glupavo ? taka li ?
che daite da pishem iako na C to 71va godina ili na Fortran i Lisp i Pascal i Prolog .. mai tva sa tama 1vite ezici oo ili asembler za PDP11.

[This message has been edited by JOKe (edited 12-12-2004).]
Активен

JOKe

  • Неактивен Неактивен
  • Публикации: 2656
  • Code or Die
логическо и функционално програмиране
« Отговор #27 -: 11.12.2004, 22:26:00 »

samo da obqasnq neshto principno sichki predmeti mi haresvat e na nqakoi predmeti prepodavaneto moje da e po dobro ama predmetite ne sa zle prosto ot sichki predmeti naistnia
Lisp i Prolog mi biaha nai bezinteresni ne vsashnost mi biaha interesni ama nemislq che shte gi polzvam inache naisitna biaha dobri i beshe dobre da gi spomenat ( v ezici za programirane predmeta a ne da gi uchim oshte 1 semestar ).


[This message has been edited by JOKe (edited 12-12-2004).]
Активен

Райчо Мукелов

  • Неактивен Неактивен
  • Публикации: 486
  • I snuggle with subwoofers
    • HULTIG - Human Language Technlogy and Bioinformatics Interest Group
логическо и функционално програмиране
« Отговор #28 -: 12.12.2004, 03:11:00 »

По-добре отвори отделна тема, в тая не му е мястото за подобни словоизлияния  
Сам се сещаш колко общо има ЛФП , програмата по която се учи и начина на преподаване във факултета  

[This message has been edited by sasquatch (edited 12-12-2004).]
Активен

JOKe

  • Неактивен Неактивен
  • Публикации: 2656
  • Code or Die
логическо и функционално програмиране
« Отговор #29 -: 12.12.2004, 15:07:00 »

o ne ne neiskam otdelna tema prikliuchvam temata   as go postvan tva samo shtoto nqakak si ne mi haresva ideqta nqkoi da kazva che koito pishe na java i C# e edi kyv si apak ako pishesh na ruby ili lisp ili prolog se edno si geroi.   tva e.
Активен

Райчо Мукелов

  • Неактивен Неактивен
  • Публикации: 486
  • I snuggle with subwoofers
    • HULTIG - Human Language Technlogy and Bioinformatics Interest Group
логическо и функционално програмиране
« Отговор #30 -: 12.12.2004, 21:22:00 »

Колкото до това и аз съм на същото мнение - в смисъл че не е важно на какво програмираш, а каква работа ти върши това.
Активен

;-)

  • Гост
логическо и функционално програмиране
« Отговор #31 -: 13.12.2004, 10:53:00 »

Започна малко да се размива темата. Има едноредово решение, което използва само цели числа. Явно това го няма в документацията на никой език, тази задача най-вероятно не я учат в никой университет. И какво правим тогава?
Активен

Phyz

  • Гост
логическо и функционално програмиране
« Отговор #32 -: 13.12.2004, 11:50:00 »

JOke пак нeщо не си разбрал човеко... ама мен не ми се обяснява повече. Не съм казал, че програмистите на Java и C# са тъпи. Казах само, че болшинството от програмистите на Lisp са умни.
Познавам няколко изключително способни програмисти на Java. Странно, обаче повечето от тях не използват Java за собствените си проекти...  Както и да е. Пиши си на квото ти е кеф, на кфото там ти е удобно... Извинявай ако съм те обидил с нещо. Аз ще си чаткам на Python и Lisp, на мен на тях ми е кеф :) Нещо като хоби :) Когато няма с кой да се наливаме с биричка :)

Не ме разбирай погрешно. И аз, както повечето от вас си изкарвам кинтите с Жава... както и около 2 милиона безработни програмисти, които до преди 10 ина години си изкарваха кинтите с COBOL и си мислеха, че са хванали господ за шлифера кат са толкова добри коболаджии... Я сега си напиши в CV то, че рабираш от COBOL :) хората ще се спукат от смях. Това май е съдбата на "бизнес" езиците - много бързо им минава модата... А пък Lisp е направен 60 те години... И бая голяма част от AutoCad е писан на Lisp :) Някой да си мисли, че AutoCad няма приложение?

М/у другото иди на Google и погледни обявите за работа:

http://www.google.com/jobs/eng/sw.html

Пусни едно търсене на страницата за Python... Някой да е на мнение, че Google са lamer и? "Търсим Жавар, ама да знае Python..." - а защо ли? Има защо...

А колкото до това с какъв точно език да почнеш в 1 курс - едва ли има по скапан избор от C++. Че дори и Java. Да не говорим за C#. И въобще за езици, които са статично типизирани (statically typed)... За да почнеш да работиш на нещо такова, трябва първо да обясниш на нещастното студентче защо кат напише програмата и тя не тръгва (а трябва първо да се компирира, а после оди обяснявай кфо е тфа компиратор и къф е смисъла от него...), защо не мога да напиша a = 5, като всъщност точно това имам в предвид, защо не мога да напиша една функция за събиране на числа, а трябва да напиша по 1 за int и long (които правят едно и също - return a + b) или да предавам параметрите с един дебел cast, а ако искам и стрингове да събирам - работата става още по заспала... template и, интерфейси, рефлекшън и т.н. и т.н. проблеми, произтичащи само от факта, че езиците от които се почва са статично типизирани... тези езици трябва да се учат бая по-нататък...
Ама тфа е съвсем друга тема, която може и да започна във форума, ако ми остане повечко време...

М/у другото sasquatch, Nikolay и ;-) ето ви една offtopic задачка. По долу има функция, която събира 2 числа (независимо какви, дори и комплексни) или стрингове или въобще обекти, които могат да се събират:

Python:

def add(a, b):
...return a + b

Lisp:

(defun add (a b)
...(+ a b)
)

Искам най-краткия аналог на горната функция, който се сетите на статично типизиран език - Pascal, C/C++, Java или C#. Най ми е интересно, как ще го направите на Java - аз едвам успях с един интерфейс и с интроспекция на подавания Object :) И изглежда гроооозно. Ама аз Java та много много не я разбирам... може и да има по-лесен начин :)
Активен

Nikolay

  • Неактивен Неактивен
  • Публикации: 62
логическо и функционално програмиране
« Отговор #33 -: 13.12.2004, 12:15:00 »

Здравейте!
Съгласен съм, че решението което публикувах не е най-бързо, просто изложих
най-ясното математическо решение (според мен). Този метод има предимство само,
 ако степента на 2-та в каноничното разлагане на n е най-голяма (примерно
n=2^500 . 3) Ако примерно n е нечетно, метода деление на 2 още на първата
итерация ще установи, че числото не е степен на 2.
Друго (НО от мат. гледна точка еквивалетно на интеративното) решение е следното:
За дадено [n] викаме функция, която го представя от десетичен в бинарен запис
(мисля че в Pasacl има такава функция). Ест. число [n] е степен
на 2 точно тогава, когато бинарният запис на [n] е от вида 100000...000
(броят на 0-те е [log_2(n)]-1 ).

С поздрав:
[Nikolay D.]
Активен
Nikolay D.

;-)

  • Гост
логическо и функционално програмиране
« Отговор #34 -: 13.12.2004, 13:31:00 »

На кой би му трябвало да прави функция за събиране на две числа? Ако вземем друг пример - функция която определя броя на единиците при двоично представяне на числото? Или друг пример - смятам сумата на всички продажби - за какво ми е да го правя за типове които не са реални? Това е несериозно просто. Към Nikolay - макар и чисто математическо твоето решение е по-близо до отговора - няма цикъл.
Активен

Phyz

  • Гост
логическо и функционално програмиране
« Отговор #35 -: 13.12.2004, 14:04:00 »

Не е въпроса в събирането... Идеята е да приложиш произволна операция, върху 2 (или повече) обекта и да вземеш резултата.
Просто го направи. Направи го за 2 Object а. Или за List от Object и ако искаш. Искам малко да се погърчиш... да понапишеш 2-3 класа за нещо, което се прави на 1 ред...

А за броя на единиците и за обръщане на свързани списъци... тфа са тъпи задачи, които се дават на тъпи интервюта за програмисти... от които работодателя ни най-малка представа не добива за умствените способности на кандидата. За 2 седмици написах по разни интервюта поне 3 версии на ltrim, поне 2 версии на lpad, един път писах strip, един път броих нули в long, eдин път умножавах 2 произволно дълги числа, един път обръщах string на място и т.н. и т.н. простотии. Много ми е чудно къде в приложение, в което се налага да намериш сумата на X продажби (SELECT SUM(bla) FROM blah GROUP BY bla...) ще ти се наложи да броиш единици в двоично представяне. Виж за събирането мога веднага да ти кажа поне 10 приложения.

Аз направих твоята задачка без да твърдя че е безсмислена. Вземи и ти напиши моята. Още повече, че моята е супер лесна - събираш 2 обекта без да ти пука какви са :) Защити си тезата. Покажи, че на Жава е по-лесно.

Моята функция освен числа събира и низове, и вектори, и наредени N торки, и списъци, и речници, и множества, и web сървъри ако щеш...:)
Активен

Райчо Мукелов

  • Неактивен Неактивен
  • Публикации: 486
  • I snuggle with subwoofers
    • HULTIG - Human Language Technlogy and Bioinformatics Interest Group
логическо и функционално програмиране
« Отговор #36 -: 13.12.2004, 14:07:00 »

М/у другото sasquatch, Nikolay и ;-) ето ви една offtopic задачка. По долу има функция, която събира 2 числа (независимо какви, дори и комплексни) или стрингове или въобще обекти, които могат да се събират:

Python:

def add(a, b):
...return a + b

Lisp:

(defun add (a b)
...(+ a b)
)

Искам най-краткия аналог на горната функция, който се сетите на статично типизиран език - Pascal, C/C++, Java или C#. Най ми е интересно, как ще го направите на Java - аз едвам успях с един интерфейс и с интроспекция на подавания Object   И изглежда гроооозно. Ама аз Java та много много не я разбирам... може и да има по-лесен начин  [/B][/QUOTE]

Теоретично на C++ ще го направя като си направя един абстрактен клас и го наследя n-пъти за всички типове обекти които искам да събирам, поне това е първото което ми идва наум, може доре да не ползвам функция а да предефинирам оператора(ите) за събиране, ама ти ни закопа 2 педи в асфалта, сещаш се колко време ще трябва да се мъча с C++  

Активен

Райчо Мукелов

  • Неактивен Неактивен
  • Публикации: 486
  • I snuggle with subwoofers
    • HULTIG - Human Language Technlogy and Bioinformatics Interest Group
логическо и функционално програмиране
« Отговор #37 -: 13.12.2004, 14:09:00 »

@Phyz
Теоретично на C++ ще го направя, като сздам един абстрактен клас и го наследя n-пъти за всички типове обекти които искам да събирам, поне това е първото което ми идва наум, може доре да не ползвам функция а да предефинирам оператора(ите) за събиране, ама ти ни закопа 2 педи в асфалта, сещаш се колко време ще трябва да се мъча с C++  
Активен

;-)

  • Гост
логическо и функционално програмиране
« Отговор #38 -: 13.12.2004, 14:36:00 »

Забавно стана...Идеята ми за единиците беше точно в това - нещо произволно което го няма реализирано в езика. SQL знам - това беше пример че не винаги ти трябва да реализираш 100 неща когато ти трябва 1. А ако ми трябва да сметна сумата на 3 числа 100% съм сигурен че няма да го направя така: Res = add(add(a, b), c), когато мога просто: Res = a+b+c;  Всъщност великата функция само повтаря това което вече го имаш - какво правиш когато не е така? Какво е било най-голямото нещо което си писал някога? А задачата не си я решил - искаше се най-ефективно решение.
Активен

Phyz

  • Гост
логическо и функционално програмиране
« Отговор #39 -: 13.12.2004, 14:57:00 »

Нали това беше идеята бре :) Аз го имам на Lisp и Python, ти го нямаш на Жава... и теб те е яд, щото аз пък имам всичко, което ти имаш на Жава, и на Ц++ и на Ц# и т.н. :)
И все пак искам да го напишеш, а не да ми се измъкваш... 3 числа се събират така : (+ 1 2 3), а 4 така (+ 1 2 3 4)... смятам че можеш да се сетиш как се събират 5, 6 и т.н.
М/у другото точно в Жава ми се налага да правя 100 неща, като ми трябва 1. Въпроса е, че ти не знаеш какво е това 1 и затова си мислиш че 100 те неща са оптималния вариант и по-умно не може да се измисли...
Човеко измъкваш се... аз ти дадох 2 задоволителни решения... ти не ми даваш нито едно. Дай ми първо решението, пък после ще продължим да се джафкаме... :)
Активен