Recommended Posts

Posted

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

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

Posted
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 "

Posted

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.

Posted (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 by Parikon
Posted

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))

 

Posted

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 ? 

Posted

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.

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