Trädvy Permalänk
Medlem
Plats
Norrköping
Registrerad
Dec 2004

Hjälp med lisp

Hej ! Jag vill skriva en rekursiv funktion som summerar alla de element på en lista som är tal.

Jag har fått fram detta:

(defun räkna-siffror (n)
(cond
((endp n) 0 )
(t (numberp n) (+ (first n ) (räkna-siffror (rest n ))))))

När jag skapar en lista med endast siffror, så fungerar allting som det ska. Problemet är att programmet inte fungerar när jag skapar en list med både siffror och tal.
Men hur ska jag göra för att den ska "ignorera" alla bokstäver och istället räkna siffrorna ?

Skulle vara tacksam för hjälp..

Corsair 600W Gaming Edition | Intel Core i5 4670K | 8GB DDR3 RAM | Corsair Carbide 330R | Sapphire Radeon R9 290 | Arctic Accelero Xtreme 3

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007

Re: Hjälp med lisp

Citat:

Ursprungligen inskrivet av mrjasmin

När jag skapar en lista med endast siffror, så fungerar allting som det ska. Problemet är att programmet inte fungerar när jag skapar en list med både siffror och tal.
Men hur ska jag göra för att den ska "ignorera" alla bokstäver och istället räkna siffrorna ?

Hur menar du med "både siffror och tal"? Menar du kanske strängar och tal? Men om du vill ignorera någonting i listan så får du lägga till ett villkor i cond-satsen som hoppas över det du inte vill räkna.

Trädvy Permalänk
Medlem
Plats
Norrköping
Registrerad
Dec 2004

Re: Re: Hjälp med lisp

Citat:

Ursprungligen inskrivet av perost
Hur menar du med "både siffror och tal"? Menar du kanske strängar och tal? Men om du vill ignorera någonting i listan så får du lägga till ett villkor i cond-satsen som hoppas över det du inte vill räkna.

Med denna lista blir det fel: (setq lista '( a 1 b 1 5 4 6 s h ) ).
Funktionen klarar inte att räkna ut siffrorna ur en lista när dem är blandade med bokstäver. Jag vill att den ska kunna räkna summan av talen, och ignorera bokstäverna.

(defun räkna-siffror (n)
(cond
((endp n) 0 )
((symbolp n) )
(t (numberp n)(+ (numberp (first n ) (räkna-siffror (rest n )))))))

Denna ovan fungerar inte heller.

Corsair 600W Gaming Edition | Intel Core i5 4670K | 8GB DDR3 RAM | Corsair Carbide 330R | Sapphire Radeon R9 290 | Arctic Accelero Xtreme 3

Trädvy Permalänk
Medlem
Plats
-
Registrerad
Aug 2005

Re: Re: Re: Hjälp med lisp

Citat:

Ursprungligen inskrivet av mrjasmin
Med denna lista blir det fel: (setq lista '( a 1 b 1 5 4 6 s h ) ).
Funktionen klarar inte att räkna ut siffrorna ur en lista när dem är blandade med bokstäver. Jag vill att den ska kunna räkna summan av talen, och ignorera bokstäverna.

(defun räkna-siffror (n)
(cond
((endp n) 0 )
((symbolp n) )
(t (numberp n)(+ (numberp (first n ) (räkna-siffror (rest n )))))))

Denna ovan fungerar inte heller.

Du kollar för det första inte på elementen i listan utan på själva listan (n är ju en lista).
På sista raden gör du flera parentesfel.
Du försöker addera resultatet från numberp (med ingenting), trots att numberp inte returnerar tal utan sanningsvärden.

Alla män är dödliga. Sokrates var dödlig. Alltså är alla män Sokrates.