Någon som kan lisp, hjälp mig hitta fel..

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Sep 2009

Någon som kan lisp, hjälp mig hitta fel..

som rubriken säger så vill jag ha hjälp att hitta felen i mina funktioner

Första.

Denna ska "se" t.ex hur många ettor de finns i ett tal... t.ex. 1 12315, ska ge att de finns 2st 1or.

(defun räkna-siffror-it (x n) (räkna-siffror x n 0))
(defun räkna-siffror (x n res) (if (= (sista-siffran n) x) (Räkna-siffror (utan-sista-siffran n) x (+ 1 res))))

den ger bara 0 som svar hela tiden.

den är iterativ också.

andra.

den ska hitta alla udda tal i en lista och skriva dem i en ny lista med bara udda tal i.

(defun udda (lista) (cond ((endp lista) '())
((eq (mod (first lista) 2) 1) (cons (first lista) (udda (rest lista))))
(t (udda (first (rest lista) )))))

Den ger ut svar samma lista som innan, hela tiden.

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jun 2004

Hur ser defun sista-siffran och utan-sista-siffran ut då? Av princip försöker jag att inte lösa CLISP-uppgifter, då jag vet att det är LiTH-uppgifter, d.v.s. skoluppgifter.

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Sep 2009

jo jag vet.. jag behöver bara hjälp med att hitta fel och säga, där kan du ändra för att få rätt. typ men att ni inte säger vad jag ska ändra liksom...

(defun my-mod (x y) (- x (* y (truncate (/ x y)))))

(defun sista-siffran (n) (my-mod n 10))

(defun utan-sista-siffran (n) (truncate (/ n 10 ))) så ser de ut..

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Sep 2009

(defun räkna-siffror-it (x n) (räkna-siffror x n 0))
(defun räkna-siffror (x n res) (if (= (sista-siffran n) x) (Räkna-siffror (utan-sista-siffran n) x (+ 1 res))))

har tänkt att jag kanske måste köra cond istället för if, gjorde de förut men fick samma problem...

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

Tycker väl som azoapes men lite tips iallafall
Första kolla hur du anropar funktionen du har ett fel(argument) i ett anrop vad jag kan se.
Andra samma där, förstår inte varför du anropar som du gör på ett av ställena.

Sen om det är lösningarna(och om jag har rätt) vet jag inte har inte räknat på det, men tycker det ser fel ut.

This time, like all times, is a very good one, if we know what to do with it.
If you don't go after what you want, you'll never have it. If you don't ask, the answer is always no. If you don't step forward, you're always in the same place

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Sep 2009

ok, jag tycker att jag måste ändra i slutet av funktionen(rna) med något. är jag på rätt väg?

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

Orkar inte koppla upp mig mot universitetet just nu för jag snart gå och lägga mig, men som i första, i sista anropet vilka värden hamnar var? Och vad gör du om if-satsen blir falsk?

I den andra jag jag inte ens se hur du kan få samma input som output ex(first(rest '(1 2 3)) = (first '(2 3) = 2 väl? översätt exemplet till din uppgift

This time, like all times, is a very good one, if we know what to do with it.
If you don't go after what you want, you'll never have it. If you don't ask, the answer is always no. If you don't step forward, you're always in the same place

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Apr 2004

Fundera på vad som händer i räkna-siffor-it om den sista siffran inte är x.

Edit: För alla stackars lispnördar som missade tisdagens upplysning (lisp 50 år) finns en inspelning här: http://www.lysator.liu.se/upplysning/film/20090908/podcast_up...

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Sep 2009

ok. men tack för tipsen

edit: har ändrat min första funktion till att den kör med cond istället.

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Apr 2004
Citat:

Ursprungligen inskrivet av Fimps
ok. men tack för tipsen

Ge inte upp. Fundera som sagt på vad man vill att räkna-siffror-it skall göra för olika värden på n. Vad skall man till exempel få för resultat av följande?
(räkna-siffror-it 1 10 0)
(räkna-siffror-it 1 11 0)
(räkna-siffror-it 1 0 5)

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jun 2004
Citat:

Ursprungligen inskrivet av Elgot
Edit: För alla stackars lispnördar som missade tisdagens upplysning (lisp 50 år) finns en inspelning här: http://www.lysator.liu.se/upplysning/film/20090908/podcast_up...

Ah, hjälp... flashbacks... Haraldsson och Dalenius och Wallner, har haft dem allihop i olika LISP-kurser.

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Sep 2009

nu får jag i alla fall inte noll längre

(defun räkna-siffror-it (x n) (räkna-siffror x n 0))
(defun räkna-siffror (x n res) (cond ((= n 0) 0)
((= (sista-siffran n) x) (+ 1 (Räkna-siffror (utan-sista-siffran n) x res)))
(t (+ 1 (räkna-siffror (utan-sista-siffran n) x res)))))

blir tre om jag tar CG-USER(5): (räkna-siffror-it 1 12315)
3

edit: kommit till detta problem nu.. "Fundera på vad som händer i räkna-siffor-it om den sista siffran inte är x." :P, snart har jag de

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Apr 2004
Citat:

Ursprungligen inskrivet av azoapes
Ah, hjälp... flashbacks... Haraldsson och Dalenius och Wallner, har haft dem allihop i olika LISP-kurser.

Hehe, jo det är en diger samling personligheter.

Citat:

Ursprungligen inskrivet av Fimps
edit: typ samma fel ändå, haha. tillbaka till ruta ett.

Som sagt, vad vill man att (räkna-siffror 1 0 5) skall ge för svar? Hur används den där femman man skickar in?

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Sep 2009

jag får ut nu att (räkna-siffror-it 1 12315) 5 och om jag kör med 1231 blir fyra, allstå så räknar den med alla siffror nu.

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Sep 2009

"Som sagt, vad vill man att (räkna-siffror 1 0 5) skall ge för svar? Hur används den där femman man skickar in?"

så sant. ärligt talat så har jag lite hjärnsläpp så här på natten, men jo den ger ju ut 0 och 1 1 4 ger 1. sen nästa 2 och så vidare till 5

edit. btw funktionen ser ut så här nu.

(defun räkna-siffror-it (x n) (räkna-siffror x n 0))
(defun räkna-siffror (x n res) (cond ((= n 0) 0)
((= (sista-siffran n) x) (+ 1 (Räkna-siffror x (utan-sista-siffran n) (+ 1 res))))
(t (+ 1 (räkna-siffror x (utan-sista-siffran n) (+ 1 res))))))

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Apr 2004
Citat:

Ursprungligen inskrivet av Fimps
edit. btw funktionen ser ut så här nu.

(defun räkna-siffror-it (x n) (räkna-siffror x n 0))
(defun räkna-siffror (x n res) (cond ((= n 0) 0)
((= (sista-siffran n) x) (+ 1 (Räkna-siffror x (utan-sista-siffran n) (+ 1 res))))
(t (+ 1 (räkna-siffror x (utan-sista-siffran n) (+ 1 res))))))

Vad är det egentligen som är bra med att släpa med sig "res" hela vägen? När vill man använda den?

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Sep 2009

ärligt talat så vet jag faktiskt inte, fick tips av en kompis att använda de, och sen på grund av att jag har en iterativ lösning också typ. men kan testa utan.

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Sep 2009
Citat:

Ursprungligen inskrivet av Elgot
Vad är det egentligen som är bra med att släpa med sig "res" hela vägen? När vill man använda den?

tog bort res. får nu samma svar ändå 5. så den verkar faktiskt onördig ja.

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Apr 2004
Citat:

Ursprungligen inskrivet av Fimps
ärligt talat så vet jag faktiskt inte, fick tips av en kompis att använda de, och sen på grund av att jag har en iterativ lösning också typ. men kan testa utan.

Nej, det är ett bra tips men fundera lite på vilken uppgift det är man försöker lösa. En iterativ funktion innehåller hela tiden all information som krävs för att returnera svaret, och då man måste veta hur många ettor som har förekommit tidigare när man kontrollerar den sista siffran måste man se till att hela tiden skicka med antalet (i det här fallet "res"). Det finns tre fall man kan hamna i (för x = 1):
*Den sista siffran är en etta
*Den sista siffran är inte en etta
*Alla siffror är kontrollerade

Du är inte så långt från lösningen, men fundera på vad som händer med "res" och när man vill använda den.

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Sep 2009
Citat:

Ursprungligen inskrivet av Elgot
Nej, det är ett bra tips men fundera lite på vilken uppgift det är man försöker lösa. En iterativ funktion innehåller hela tiden all information som krävs för att returnera svaret, och då man måste veta hur många ettor som har förekommit tidigare när man kontrollerar den sista siffran måste man se till att hela tiden skicka med antalet (i det här fallet "res"). Det finns tre fall man kan hamna i (för x = 1):
*Den sista siffran är en etta
*Den sista siffran är inte en etta
*Alla siffror är kontrollerade

Du är inte så långt från lösningen, men fundera på vad som händer med "res" och när man vill använda den.

aha så sant... jo gör de, allså vill ju ha den till att den liksom lägger dem som är lika med ett i res. och sen i slutet skriver ut res. men nu får jag att de räknar med alla tal och de är ju inte helt meningen kanske nej.

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Apr 2004
Citat:

Ursprungligen inskrivet av Fimps
aha så sant... jo gör de, allså vill ju ha den till att den liksom lägger dem som är lika med ett i res. och sen i slutet skriver ut res.

Precis. Fundera hur man kan hantera de tre fallen.
Den siffra man kontrollerar är 1 => öka res och kontrollera nästa siffra
Siffran är inte 1 => kontrollera nästa siffra utan att öka res
Talet är slut => returnera res

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jun 2004

Den lilla fallmatris Elgot just gjorde, är ditt effektivaste verktyg när du skriver LISP-funktioner (eller rekursiva funktioner i allmänhet). Det är ingen idé att sätta sig ner och försöka skriva om man inte från början vet exakt hur det ska gå till att få det rätt.

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Sep 2009

har skrivit så här nu..

(defun räkna-siffror-it (x n) (räkna-siffror x n 0))
(defun räkna-siffror (x n res) (cond ((= n 0) res)
((> (sista-siffran n) x) (räkna-siffror x (utan-sista-siffran n) res))
((= (sista-siffran n) x) (Räkna-siffror x (utan-sista-siffran n) (+ 1 res)))
(t (Räkna-siffror x (utan-sista-siffran n) (+ 1 res)))))

fixa till att jag har så här också nu.

(cond ((= n 0) res)
((> (sista-siffran n) x) (räkna-siffror x (utan-sista-siffran n) res))

btw vet att jag inte ska ha ">"

Edit: har fått den att fungerar :D. Jag tackar för all hjälp tusen tack.. btw av rimliga själv så postar jag inte lösningen.

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Apr 2004
Citat:

Ursprungligen inskrivet av Fimps
Edit: har fått den att fungerar :D. Jag tackar för all hjälp tusen tack.. btw av rimliga själv så postar jag inte lösningen.

Trevligt. Visst blir man lite glad av lisp?

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Sep 2009
Citat:

Ursprungligen inskrivet av Elgot
Trevligt. Visst blir man lite glad av lisp?

haha ja såklart, och efter jag hade löst första funktionen jag hade problem med så löste jag också andra direkt efter :D.