hiper111 Posted May 11, 2017 Report Posted May 11, 2017 Witam, mam problem z funkcja w programie lisp. Moim zadaniem jest: "Napisz funkcję obliczającą dowolny wyraz ciągu: a(0)= 5 a(n) = 3*a(n-1) + 2 za pomocą funkcji warunkowej cond" Mój obecny kod: (defun wyraz(n,a) (cond ((= n 0) ( a)) ((> n 0) (+ (* (* (- n 1) 3 a) ) 2)))) Próbowałem na rożne sposoby, lecz cały czas bez żadnego skutku. Prosze o wskazanie mojego błedu Quote
kruszynski Posted May 12, 2017 Report Posted May 12, 2017 (defun wyraz(n,a) (cond ((= n 0) ( a)) ((> n 0) (+ (* (* (- n 1) 3 a) ) 2)))) ja tu widzę kilka błędów: 1. dlaczego a jest parametrem wywołania? 2. w treści zadania jest jakaś magiczna liczba 5. Nie ma jej w kodzie. zastanów się gdzie powinna być 3. w pierwszym warunku: ( a ) ? 4. w drugim warunku nawiasy są pomieszane To tak na początek. jak się z tym uporasz i dalej nie będzie działało to daj znać. hiper111 1 Quote
hiper111 Posted May 12, 2017 Author Report Posted May 12, 2017 50 minut temu, kruszynski napisał: (defun wyraz(n,a) (cond ((= n 0) ( a)) ((> n 0) (+ (* (* (- n 1) 3 a) ) 2)))) ja tu widzę kilka błędów: 1. dlaczego a jest parametrem wywołania? 2. w treści zadania jest jakaś magiczna liczba 5. Nie ma jej w kodzie. zastanów się gdzie powinna być 3. w pierwszym warunku: ( a ) ? 4. w drugim warunku nawiasy są pomieszane To tak na początek. jak się z tym uporasz i dalej nie będzie działało to daj znać. (defun wyraz(n) (cond ((= n 0) (= a 5)) ((> n 0) (+ (* (* (- n 1) 3 a) ) 2))))) wyskakuje mi bład " In WYRAZ: Undeclared free variable A " Quote
hiper111 Posted May 12, 2017 Author Report Posted May 12, 2017 Nawiasy w drugim warunku (+(*(* 3 a) (- n 1)) 2) Quote
kruszynski Posted May 12, 2017 Report Posted May 12, 2017 38 minut temu, hiper111 napisał: wyskakuje mi bład " In WYRAZ: Undeclared free variable A " O czym może to świadczyć? ((= n 0) (= a 5)) znaczy: jeśli n jest równe 0, to sprawdź czy a jest równe 5 . hiper111 1 Quote
hiper111 Posted May 12, 2017 Author Report Posted May 12, 2017 w takim razie nie miałem pojecia ze przypisane wartosci do a dałem razem w warunku. W przykladach jest napisane " => 3 " ale to raczej nie jest deklaracja wartości lecz wypisanie wartości "w komentarzu". W takim razie powinno to wygladac tak? ((= n 0) = a 5)). Przepraszam, ze za bardzo tego nie ogarniam, lecz mam pierwszy raz do czynienia z tym językiem. Quote
kruszynski Posted May 12, 2017 Report Posted May 12, 2017 przypisanie wartości do zmiennej to setq czyli (setq a 5) tylko po co tutaj a ? Mała podpowiedź: w tym przypadku trzeba wykorzystać rekurencję. hiper111 1 Quote
hiper111 Posted May 12, 2017 Author Report Posted May 12, 2017 Patrząc teraz na ta strone jesli chodzi o rekurencje http://bacon.umcs.lublin.pl/~pgiza/dyd/lispouczek/lk.php-nr=14.htm (defun silnia (n) (cond ((< n 2) n) (t (* n (silnia (- n 1)))) ) ) => silnia (silnia 5) => 120 jest tylko jeden warunek, w LISPIE zmienna t oznacza zawsze wartosc prawdziwa? Quote
Parikon Posted May 12, 2017 Report Posted May 12, 2017 (edited) (cond ((evenp a) a) ;jeśli a jest parzyste, zwróć a ((> a 7) (/ a 2)) ;inaczej, jeśli a jest > niż 7, zwróć a/2 ((< a 5) (- a 1)) ;inaczej, jeśli a jest < niż 5, zwróć a-1 (t 17) ;inaczej zwróć 17 ) => 2 (cond ((= n 0) 5) ; jeśli n jest 0 to zwróć 5 ((> n 0) (wzór na a)) ; zwróć a ) ; koniec cond Dawno nie pisałem nic w Lispie ale czy nie tak to powinno być? Edited May 12, 2017 by Parikon hiper111 1 Quote
kruszynski Posted May 12, 2017 Report Posted May 12, 2017 1 minutę temu, hiper111 napisał: w LISPIE zmienna t oznacza zawsze wartosc prawdziwa? tak 1 minutę temu, Parikon napisał: czy nie tak to powinno być? tak Quote
hiper111 Posted May 12, 2017 Author Report Posted May 12, 2017 (edited) Po przerobieniu kodu z waszymi wskazówkami dalej mam bład :/ Edited May 12, 2017 by hiper111 Quote
Parikon Posted May 12, 2017 Report Posted May 12, 2017 powiedz coś maszynie o zmiennej a. hiper111 1 Quote
kruszynski Posted May 12, 2017 Report Posted May 12, 2017 O to właśnie chodzi, "a" to nie zmienna, tylko nazwa funkcji, która ma być rekurencją. 17 godzin temu, hiper111 napisał: a(n) = 3*a(n-1) + 2 czyli Ty mnożysz 3 * a (jako zminną) * (n-1) ma być 3 * a ( jako wynik dla obliczenia funkcji a dla wartości (n-1)) hiper111 1 Quote
hiper111 Posted May 12, 2017 Author Report Posted May 12, 2017 W takim razie źle wzór a a(n). Można zapisać tą funkcję jakoś sensownie ? Jakoś w takim sposób? (+(*(* 3 (- n 1)) 2) czy trzeba zrobić drugą funkcje wspomagająca obliczenia ? Quote
kruszynski Posted May 12, 2017 Report Posted May 12, 2017 do tego właśnie służy rekurencja powinno być coś typu ( defun a ( n / ) (cond ( ( = n 0 ) 5 ) ( t (+ (* 3 (a (- n 1 ) ) ) 2 ) ) ) ) hiper111 1 Quote
hiper111 Posted May 12, 2017 Author Report Posted May 12, 2017 3 minuty temu, kruszynski napisał: ( defun a ( n / ) Za co w tym przypadku odpowiada (n / )? Quote
kruszynski Posted May 12, 2017 Report Posted May 12, 2017 n to parametr wywołania funkcji / oddziela parametry od zmiennych lokalnych. w tym przypadku nie jest potrzebne ale z przyzwyczajenia ( makro w edytorze) mi się napisało hiper111 1 Quote
hiper111 Posted May 12, 2017 Author Report Posted May 12, 2017 Program działa, oraz zostało wszystko dobrze wytłumaczone! Dziękuję bardzo za pomoc! Quote
kruszynski Posted May 12, 2017 Report Posted May 12, 2017 pozostaje jeszcze jedna kwestia co się stanie jeśli wywołamy funkcję tak: (a -2) Quote
hiper111 Posted May 12, 2017 Author Report Posted May 12, 2017 "Stack overflow on value stack. [Condition of type CCL::STACK-OVERFLOW-CONDITION]" Przy wartosciach ujemnych wywala bład. Quote
kruszynski Posted May 12, 2017 Report Posted May 12, 2017 właśnie. dla 0 zwraca 5, dla wartości większych liczy wartość dla wartości mniejszych od 0 liczy w nieskończoność ( do wyczerpania zasobów w tym przypadku stosu ) dla kolejnych coraz mniejszych wartości. co z tym zrobić? np: - możemy przyjąć że dla wartość ujemnych zwraca jakąś wartość np: 0 , ale niby dlaczego mielibyśmy coś zakładać. - możemy wskazać osobie zlecającej, że dla takiego warunku wynik jest nieokreślony i niech zleceniodawca się martwi. - możemy też uruchomić funkcję ( exit ) skończy się działanie programu. Możemy jeszcze jakąś ładną obsługę błędów zrobić, żeby wyświetliło komunikat o tym jaki problem napotkaliśmy. Quote
hiper111 Posted May 12, 2017 Author Report Posted May 12, 2017 ( (< n 0 ) ’Wynik-jest-nieokreślony) Masz na mysli dodanie takiego warunku ? Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.