Rekomendowane odpowiedzi

Opublikowano

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

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

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

Opublikowano

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.

Opublikowano (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 przez Parikon
Opublikowano

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 ? 

Opublikowano

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.

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