Permalänk
Medlem

Hjälp med lisp

Hej ! Jag skulle behöva hjälp med att skriva en funktion som vänder på siffror. Så ifall jag matar in 123 ska funktionen returnera 321..

Matematiskt sett vet jag hur jag ska göra, fast inte hur jag ska implementera det i LISP. Man tar ju sista siffran * 10 sen plusar man på näst sista, sen gör man om samma sak igen.

Tackar på förhand...

Visa signatur

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

Permalänk
Medlem

Ingen ?

Visa signatur

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

Permalänk
Medlem

Skulle nog kunna lösas med en resultat variabel.
Du vet hur man plocka fram sista siffran i ett tal?
Den siffran vill du ju ha sist i det nya talet eller hur, så om du då hela tiden tar fram fram sista siffran i det gamla talet och lägger den sist i det nya så kommer du ju ha vänt det.

Trace:
f(tal vänt-tal) - funktion(argument argument)

f(1234 0)
f(123 4)
f(12 43)
f(1 432)
f(0 4321)

Du bör ju ha gjort lägg-till-siffra-sist och sista-siffran tidigare, ta-bort-sista-siffran är också användbar, om inte; gör dem. Efter det bör det inte vara så svårt, du vill ju lägga till sista-siffran av inmatat tal sist hela tiden i din resultatvariabel och trolla bort sista siffran i det inmatade talet.

Testa, och om du inte får till det posta lite kod här inom code-taggar så kan vi se om vi kan hjälpa dig, då ingen kommer nog att ge den exakta koden.

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

Något liknande (lista-av-siffror-till-tal (reverse (tal-till-lista-av-siffror tal)))
Med vettiga implementationer av lista-av-siffror-till-tal, reverse och tal-till-lista-av-siffror

Visa signatur

void@qnet
teeworlds, stålverk80, evil schemer, c, c++
Languages shape the way we think, or don't.

Permalänk
Medlem

Skulle väl också fungera, men blir inte det krångligare att först definera en funktion för att göra ett tal till en lista av siffror sedan skapa reverse och tillbaka till tal igen?

Om det är den laboration jag tror det är så får man nog inte använda den inbyggda reverse, då en av uppgifterna går ut på att skapa den. Forsatt om det är den jag tror det är så står det i beskrivningen till uppgiften att man ska använda lägg-till-siffra-sist och sista-siffran och andra tidigare skapta funktioner.

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
Citat:

Ursprungligen inskrivet av matte232
Skulle väl också fungera, men blir inte det krångligare att först definera en funktion för att göra ett tal till en lista av siffror sedan skapa reverse och tillbaka till tal igen?

Om det är den laboration jag tror det är så får man nog inte använda den inbyggda reverse, då en av uppgifterna går ut på att skapa den. Forsatt om det är den jag tror det är så står det i beskrivningen till uppgiften att man ska använda lägg-till-siffra-sist och sista-siffran och andra tidigare skapta funktioner.

Man ska använda lägg-till-siffra-sist och sista-siffran. Jag har förstått hur jag ska göra men problemet är hur jag ska spara allt i en resultatvariabel. Tar jag + res så for jag summan av de enskilda siffrorna i talet.

(defun vänd (n res) (if (= 0 (sista-siffran n)) res (+ res (lägg-sist (sista-siffran n) res) (vänd (utan-sista n) res))))

Visa signatur

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

Permalänk
Medlem

Har även denna som jag inte riktigt får att fungera...

(defun vänd (n res) (if (= (sista-siffran n) 0 ) res (vänd (lägg-sist (sista-siffran n) res) (utan-sista n) )))

Visa signatur

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

Permalänk
Medlem

Har löst det nu...

(defun vänd (n res) (if (= (sista-siffran n) 0 ) res (vänd (utan-sista n) (lägg-sist (sista-siffran n) res) )))

Visa signatur

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

Permalänk
Hedersmedlem

Det vore väl annars ganska enkelt att skriva en iterativ funktion med två parametrar: a och b. Varje iteration anropar sedan funktionen med 10*a + (b mod 10) samt heltalsdelen av b/10.

Permalänk
Medlem

Men det är ju det han gör i stort sett
(defun sista-siffran (n)
(mod n 10))

och

(defun lägg-till-siffra-sist (siffra n)
(+ siffra (* n 10)))

Vilket resulterar att han gör som du sa, fast i skiljda funktioner.

Edit: Förstår vad du menar när jag tänker efter lite; varför göra mer än vad som behövs?

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
Citat:

Ursprungligen inskrivet av matte232
Förstår vad du menar när jag tänker efter lite; varför göra mer än vad som behövs?

Det kanske är jag som är blind, men har det avslöjats hur sista-siffran och lägg-till-siffra-sist ser ut?

Permalänk
Medlem

Nä jag bara antog det, har varit uppe på forumet tidigare med (mod n 10) bl.a. fimps tråd och lägg till sista siffran beskrev han ju i första posten, men har ingen garanti att de ser ut så.
Så nej du är inte blind

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

Blev lite sugen att skriva det själv

Iterativa versionen i scheme:

(define (reverse-num n) (let loop ((i n) (o 0)) (if (= i 0) o (let ((r (remainder i 10)) (ni (floor (/ i 10))) (no (* o 10))) (loop ni (+ r no))))))

Visa signatur

void@qnet
teeworlds, stålverk80, evil schemer, c, c++
Languages shape the way we think, or don't.