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

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

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
Norrköping
Registrerad
Dec 2004

Ingen ?

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
Mar 2007

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.

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
Stockholm
Registrerad
Nov 2001

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

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

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

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.

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
Norrköping
Registrerad
Dec 2004
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))))

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
Norrköping
Registrerad
Dec 2004

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

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
Norrköping
Registrerad
Dec 2004

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

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
Hedersmedlem
Plats
Linköping
Registrerad
Apr 2004

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.

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

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?

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

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

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

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
Stockholm
Registrerad
Nov 2001

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

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