rekurencja w lisp

Odpowiedz Nowy wątek
2019-08-25 16:09
0

Dzien dobry czy ktos moglby to zrobic w jezyku lisp ?

Dana jest rekursywna definicja funkcji Fun(x,y), gdzie SUCC(y)= y+1.

Fun(0,y)=y+2,
Fun(x+1,y)= SUCC(Fun(x, SUCC(y)))

Znajdź: Fun(1,4); Fun(3,2);

Pozostało 580 znaków

2019-08-25 16:15
1

A co juz napisales?


01010100 01110101 01110100 01100001 01101010 00100000 01101110 01101001 01100101 00100000 01101101 01100001 00100000 01101110 01101001 01100011 00100000 01100011 01101001 01100101 01101011 01100001 01110111 01100101 01100111 01101111 00101110 00100000 01001001 01100011 00100000 01110011 01110100 01101111 01101110 01110100 00101110

Pozostało 580 znaków

2019-08-25 16:20
1
stivens napisał(a):

A co juz napisales?

Tak to treść zadania

Pozostało 580 znaków

2019-08-25 16:25
2

XD

Zapytalem o wklad wlasny. Pokaz co napisales i czego nie rozumiesz - pomozemy

Jak nie zaczales to moze: https://learnxinyminutes.com/docs/racket/


01010100 01110101 01110100 01100001 01101010 00100000 01101110 01101001 01100101 00100000 01101101 01100001 00100000 01101110 01101001 01100011 00100000 01100011 01101001 01100101 01101011 01100001 01110111 01100101 01100111 01101111 00101110 00100000 01001001 01100011 00100000 01110011 01110100 01101111 01101110 01110100 00101110

Pozostało 580 znaków

2019-08-25 16:33
0
stivens napisał(a):

XD

Zapytalem o wklad wlasny. Pokaz co napisales i czego nie rozumiesz - pomozemy

Jak nie zaczales to moze: https://learnxinyminutes.com/docs/racket/

wlasnie cos takiego zrobilem ale oczywiscie nie dziala to

(defun Fun (x y)
(if (= x 0) (+ y 2)
(if (Fun(+ x 1) (incf y))
)))

I jak, ogarnales juz? Czy napisac to nizej prefixowo? - stivens 2019-08-25 16:49

Pozostało 580 znaków

2019-08-25 16:36
0

To moze pseudokod

if x == 0:
    return y+2
else:
    return fun(x-1,y+1)+1

01010100 01110101 01110100 01100001 01101010 00100000 01101110 01101001 01100101 00100000 01101101 01100001 00100000 01101110 01101001 01100011 00100000 01100011 01101001 01100101 01101011 01100001 01110111 01100101 01100111 01101111 00101110 00100000 01001001 01100011 00100000 01110011 01110100 01101111 01101110 01110100 00101110

Pozostało 580 znaków

2019-08-25 16:59

screenshot-20190825165935.png


sorry Racket to jedyny Lisp w jakim pisalem wiec bedziesz musial sobie przetlumaczyc swojego dialektu :P


01010100 01110101 01110100 01100001 01101010 00100000 01101110 01101001 01100101 00100000 01101101 01100001 00100000 01101110 01101001 01100011 00100000 01100011 01101001 01100101 01101011 01100001 01110111 01100101 01100111 01101111 00101110 00100000 01001001 01100011 00100000 01110011 01110100 01101111 01101110 01110100 00101110
edytowany 2x, ostatnio: stivens, 2019-08-25 17:01
bardzo dziękuje - KAMENSHIK 2019-08-25 17:20
@stivens: za proste to dla niego zrobiłeś, trzeba było tak: http://ix.io/1TBa - hauleth 2019-08-27 12:49

Pozostało 580 znaków

2019-08-27 12:54
2

Proszę, bez większego problemu powinieneś to przetłumaczyć na dowolnego lispa-1:

((λ (func)
    (printf "fun(1, 4) := ~s\n" (func 1 4))
    (printf "fun(3, 2) := ~s\n" (func 3 2)))
 ((λ (succ Y) (Y (λ (f) (λ (x y) (if (= 0 x)
                                     (+ y 2)
                                     (succ (f (- x 1) (succ y))))))))
  (λ (y) (+ y 1))
  (λ (b) ((λ (f) (b (λ (x y) ((f f) x y))))
             (λ (f) (b (λ (x y) ((f f) x y))))))))
edytowany 1x, ostatnio: hauleth, 2019-08-27 12:55

Pozostało 580 znaków

2019-08-27 23:33
0

Po pierwsze oducz się tego "nie działa", konkrety: nie kompiluje się, wywala się czy co? Może zwraca Nil? Niestety nie mam pod ręką kompilatora, ale na pierwszy rzut oka, problemem jest ten drugi if. Operator if przykuje trzy parametry: warunek jesli-tak jeśli-nie. Jeśli ostatni nie jest podany zwróci Nil, jeśli warunek nie jest spełniony. Wobec tego, u ciebie najpierw jest sprawdzany właściwy warunek, jeśli spełniony, zwraca y+2, a jeśli nie... Zamiast po prostu zwrócić wartość, umieszczasz ja jako warunek dla kolejnego ifa bez kolejnych parametrów. To chyba się nie skompiluje... ?

Poza tym x+1 masz we wzorcu funkcji, tak więc w implementacji musisz odwrócić znak :)

Będzie jakoś tak:

(defun Fun (x y)
    (if (= x 0) (+ y 2)
       (+ (Fun (- x 1) (+ y 1)) 1)))

Zmieniłem też brzydkie incf. W tym miejscu jest bezzasadne (niepotrzebny skutek uboczny). Zmiennego stanu używaj tylko jeśli wiesz co robisz. To jest bagno.
Edit: zabrakło jeszcze +1


edytowany 7x, ostatnio: elwis, 2019-08-28 14:12
Ta funkcja nie spelnia wzoru - stivens 2019-08-28 08:57
Napisałem jakoś tak. Rzeczywiście zgubiłem +1 - elwis 2019-08-28 14:09

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0