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

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

 

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.

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się