LISP program obliczajacy wyraz ciagu


Recommended Posts

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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 "

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

(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 by Parikon
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...