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

Permalänk
Medlem

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.

Visa signatur

AMD Ryzen 7 7800X3D | Gigabyte B650 Gaming X AX | G.Skill 32GB (2x16GB) DDR5 6000MHz CL30 Trident Z5 Neo RGB | GIGABYTE GeForce RTX 4070 WindForce 3 OC | Montech Metal DT24 Premium ARGB | 2 x Kingston KC3000 M.2 NVMe SSD Gen 4 2048GB | ASUS TUF Gaming 850w Gold | Corsair iCUE 4000D RGB Airflow | 27" LG UltraGear 27GP850P-B |

Permalänk
Medlem

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.

Permalänk
Medlem

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

Visa signatur

AMD Ryzen 7 7800X3D | Gigabyte B650 Gaming X AX | G.Skill 32GB (2x16GB) DDR5 6000MHz CL30 Trident Z5 Neo RGB | GIGABYTE GeForce RTX 4070 WindForce 3 OC | Montech Metal DT24 Premium ARGB | 2 x Kingston KC3000 M.2 NVMe SSD Gen 4 2048GB | ASUS TUF Gaming 850w Gold | Corsair iCUE 4000D RGB Airflow | 27" LG UltraGear 27GP850P-B |

Permalänk
Medlem

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

Visa signatur

AMD Ryzen 7 7800X3D | Gigabyte B650 Gaming X AX | G.Skill 32GB (2x16GB) DDR5 6000MHz CL30 Trident Z5 Neo RGB | GIGABYTE GeForce RTX 4070 WindForce 3 OC | Montech Metal DT24 Premium ARGB | 2 x Kingston KC3000 M.2 NVMe SSD Gen 4 2048GB | ASUS TUF Gaming 850w Gold | Corsair iCUE 4000D RGB Airflow | 27" LG UltraGear 27GP850P-B |

Permalänk
Medlem

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.

Visa signatur

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

Permalänk
Medlem

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

Visa signatur

AMD Ryzen 7 7800X3D | Gigabyte B650 Gaming X AX | G.Skill 32GB (2x16GB) DDR5 6000MHz CL30 Trident Z5 Neo RGB | GIGABYTE GeForce RTX 4070 WindForce 3 OC | Montech Metal DT24 Premium ARGB | 2 x Kingston KC3000 M.2 NVMe SSD Gen 4 2048GB | ASUS TUF Gaming 850w Gold | Corsair iCUE 4000D RGB Airflow | 27" LG UltraGear 27GP850P-B |

Permalänk
Medlem

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

Visa signatur

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

Permalänk
Hedersmedlem

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

Permalänk
Medlem

ok. men tack för tipsen

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

Visa signatur

AMD Ryzen 7 7800X3D | Gigabyte B650 Gaming X AX | G.Skill 32GB (2x16GB) DDR5 6000MHz CL30 Trident Z5 Neo RGB | GIGABYTE GeForce RTX 4070 WindForce 3 OC | Montech Metal DT24 Premium ARGB | 2 x Kingston KC3000 M.2 NVMe SSD Gen 4 2048GB | ASUS TUF Gaming 850w Gold | Corsair iCUE 4000D RGB Airflow | 27" LG UltraGear 27GP850P-B |

Permalänk
Hedersmedlem
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)

Permalänk
Medlem
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.

Permalänk
Medlem

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

Visa signatur

AMD Ryzen 7 7800X3D | Gigabyte B650 Gaming X AX | G.Skill 32GB (2x16GB) DDR5 6000MHz CL30 Trident Z5 Neo RGB | GIGABYTE GeForce RTX 4070 WindForce 3 OC | Montech Metal DT24 Premium ARGB | 2 x Kingston KC3000 M.2 NVMe SSD Gen 4 2048GB | ASUS TUF Gaming 850w Gold | Corsair iCUE 4000D RGB Airflow | 27" LG UltraGear 27GP850P-B |

Permalänk
Hedersmedlem
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?

Permalänk
Medlem

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.

Visa signatur

AMD Ryzen 7 7800X3D | Gigabyte B650 Gaming X AX | G.Skill 32GB (2x16GB) DDR5 6000MHz CL30 Trident Z5 Neo RGB | GIGABYTE GeForce RTX 4070 WindForce 3 OC | Montech Metal DT24 Premium ARGB | 2 x Kingston KC3000 M.2 NVMe SSD Gen 4 2048GB | ASUS TUF Gaming 850w Gold | Corsair iCUE 4000D RGB Airflow | 27" LG UltraGear 27GP850P-B |

Permalänk
Medlem

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

Visa signatur

AMD Ryzen 7 7800X3D | Gigabyte B650 Gaming X AX | G.Skill 32GB (2x16GB) DDR5 6000MHz CL30 Trident Z5 Neo RGB | GIGABYTE GeForce RTX 4070 WindForce 3 OC | Montech Metal DT24 Premium ARGB | 2 x Kingston KC3000 M.2 NVMe SSD Gen 4 2048GB | ASUS TUF Gaming 850w Gold | Corsair iCUE 4000D RGB Airflow | 27" LG UltraGear 27GP850P-B |

Permalänk
Hedersmedlem
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?

Permalänk
Medlem

ä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.

Visa signatur

AMD Ryzen 7 7800X3D | Gigabyte B650 Gaming X AX | G.Skill 32GB (2x16GB) DDR5 6000MHz CL30 Trident Z5 Neo RGB | GIGABYTE GeForce RTX 4070 WindForce 3 OC | Montech Metal DT24 Premium ARGB | 2 x Kingston KC3000 M.2 NVMe SSD Gen 4 2048GB | ASUS TUF Gaming 850w Gold | Corsair iCUE 4000D RGB Airflow | 27" LG UltraGear 27GP850P-B |

Permalänk
Medlem
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.

Visa signatur

AMD Ryzen 7 7800X3D | Gigabyte B650 Gaming X AX | G.Skill 32GB (2x16GB) DDR5 6000MHz CL30 Trident Z5 Neo RGB | GIGABYTE GeForce RTX 4070 WindForce 3 OC | Montech Metal DT24 Premium ARGB | 2 x Kingston KC3000 M.2 NVMe SSD Gen 4 2048GB | ASUS TUF Gaming 850w Gold | Corsair iCUE 4000D RGB Airflow | 27" LG UltraGear 27GP850P-B |

Permalänk
Hedersmedlem
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.

Permalänk
Medlem
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.

Visa signatur

AMD Ryzen 7 7800X3D | Gigabyte B650 Gaming X AX | G.Skill 32GB (2x16GB) DDR5 6000MHz CL30 Trident Z5 Neo RGB | GIGABYTE GeForce RTX 4070 WindForce 3 OC | Montech Metal DT24 Premium ARGB | 2 x Kingston KC3000 M.2 NVMe SSD Gen 4 2048GB | ASUS TUF Gaming 850w Gold | Corsair iCUE 4000D RGB Airflow | 27" LG UltraGear 27GP850P-B |

Permalänk
Hedersmedlem
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

Permalänk
Medlem

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.

Permalänk
Medlem

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.

Visa signatur

AMD Ryzen 7 7800X3D | Gigabyte B650 Gaming X AX | G.Skill 32GB (2x16GB) DDR5 6000MHz CL30 Trident Z5 Neo RGB | GIGABYTE GeForce RTX 4070 WindForce 3 OC | Montech Metal DT24 Premium ARGB | 2 x Kingston KC3000 M.2 NVMe SSD Gen 4 2048GB | ASUS TUF Gaming 850w Gold | Corsair iCUE 4000D RGB Airflow | 27" LG UltraGear 27GP850P-B |

Permalänk
Hedersmedlem
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?

Permalänk
Medlem
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.

Visa signatur

AMD Ryzen 7 7800X3D | Gigabyte B650 Gaming X AX | G.Skill 32GB (2x16GB) DDR5 6000MHz CL30 Trident Z5 Neo RGB | GIGABYTE GeForce RTX 4070 WindForce 3 OC | Montech Metal DT24 Premium ARGB | 2 x Kingston KC3000 M.2 NVMe SSD Gen 4 2048GB | ASUS TUF Gaming 850w Gold | Corsair iCUE 4000D RGB Airflow | 27" LG UltraGear 27GP850P-B |