LISP program obliczajacy wyraz ciagu


Rekomendowane odpowiedzi

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 

Plik.png

Odnośnik do komentarza
Udostępnij na innych stronach

(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ć.

Odnośnik do komentarza
Udostępnij na innych stronach

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 "

Odnośnik do komentarza
Udostępnij na innych stronach

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.

Odnośnik do komentarza
Udostępnij na innych stronach

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? 

Odnośnik do komentarza
Udostępnij na innych stronach

(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 przez Parikon
Odnośnik do komentarza
Udostępnij na innych stronach

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.

Odnośnik do komentarza
Udostępnij na innych stronach

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ą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie