hiper111 Opublikowano 11 Maja 2017 Zgłoś Udostępnij Opublikowano 11 Maja 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 Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
kruszynski Opublikowano 12 Maja 2017 Zgłoś Udostępnij Opublikowano 12 Maja 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 Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Parikon Opublikowano 12 Maja 2017 Zgłoś Udostępnij Opublikowano 12 Maja 2017 Przykłady Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
hiper111 Opublikowano 12 Maja 2017 Autor Zgłoś Udostępnij Opublikowano 12 Maja 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 " Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
hiper111 Opublikowano 12 Maja 2017 Autor Zgłoś Udostępnij Opublikowano 12 Maja 2017 Nawiasy w drugim warunku (+(*(* 3 a) (- n 1)) 2) Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
kruszynski Opublikowano 12 Maja 2017 Zgłoś Udostępnij Opublikowano 12 Maja 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 Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
hiper111 Opublikowano 12 Maja 2017 Autor Zgłoś Udostępnij Opublikowano 12 Maja 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. Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
kruszynski Opublikowano 12 Maja 2017 Zgłoś Udostępnij Opublikowano 12 Maja 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 Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
hiper111 Opublikowano 12 Maja 2017 Autor Zgłoś Udostępnij Opublikowano 12 Maja 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? Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Parikon Opublikowano 12 Maja 2017 Zgłoś Udostępnij Opublikowano 12 Maja 2017 (edytowane) (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ć? Edytowane 12 Maja 2017 przez Parikon hiper111 1 Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
kruszynski Opublikowano 12 Maja 2017 Zgłoś Udostępnij Opublikowano 12 Maja 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 Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
hiper111 Opublikowano 12 Maja 2017 Autor Zgłoś Udostępnij Opublikowano 12 Maja 2017 (edytowane) Po przerobieniu kodu z waszymi wskazówkami dalej mam bład :/ Edytowane 12 Maja 2017 przez hiper111 Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Parikon Opublikowano 12 Maja 2017 Zgłoś Udostępnij Opublikowano 12 Maja 2017 powiedz coś maszynie o zmiennej a. hiper111 1 Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
kruszynski Opublikowano 12 Maja 2017 Zgłoś Udostępnij Opublikowano 12 Maja 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 Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
hiper111 Opublikowano 12 Maja 2017 Autor Zgłoś Udostępnij Opublikowano 12 Maja 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 ? Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
kruszynski Opublikowano 12 Maja 2017 Zgłoś Udostępnij Opublikowano 12 Maja 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 Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
hiper111 Opublikowano 12 Maja 2017 Autor Zgłoś Udostępnij Opublikowano 12 Maja 2017 3 minuty temu, kruszynski napisał: ( defun a ( n / ) Za co w tym przypadku odpowiada (n / )? Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
kruszynski Opublikowano 12 Maja 2017 Zgłoś Udostępnij Opublikowano 12 Maja 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 Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Parikon Opublikowano 12 Maja 2017 Zgłoś Udostępnij Opublikowano 12 Maja 2017 Praktyczny kurs AutoLISP-u hiper111 1 Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
hiper111 Opublikowano 12 Maja 2017 Autor Zgłoś Udostępnij Opublikowano 12 Maja 2017 Program działa, oraz zostało wszystko dobrze wytłumaczone! Dziękuję bardzo za pomoc! Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
kruszynski Opublikowano 12 Maja 2017 Zgłoś Udostępnij Opublikowano 12 Maja 2017 pozostaje jeszcze jedna kwestia co się stanie jeśli wywołamy funkcję tak: (a -2) Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
hiper111 Opublikowano 12 Maja 2017 Autor Zgłoś Udostępnij Opublikowano 12 Maja 2017 "Stack overflow on value stack. [Condition of type CCL::STACK-OVERFLOW-CONDITION]" Przy wartosciach ujemnych wywala bład. Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
kruszynski Opublikowano 12 Maja 2017 Zgłoś Udostępnij Opublikowano 12 Maja 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. Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
hiper111 Opublikowano 12 Maja 2017 Autor Zgłoś Udostępnij Opublikowano 12 Maja 2017 ( (< n 0 ) ’Wynik-jest-nieokreślony) Masz na mysli dodanie takiego warunku ? Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
kruszynski Opublikowano 12 Maja 2017 Zgłoś Udostępnij Opublikowano 12 Maja 2017 no, coś w tym stylu, Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
Dołącz do dyskusji
Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.