You are not logged in.

  • "XoCountessoX" started this thread

Posts: 2

Date of registration: Jan 18th 2011

1

Tuesday, January 18th 2011, 6:35pm

eine Zahl rekursiv in ihre Ziffern zerlegen

Hallo zusammen,
ich bin neu in Foren habe aber eine wichtige Frage also los gehts:
Ich soll eine beliebige Zahl in ihre Ziffern zerlegen und anschließend in einer Liste speichern.
Bisher habe ich folgendes



(define (digit n pos)
(let ((n-ziffern
(remainder n(expt 10 pos))))
(quotient n-ziffern (expt 10 (- pos 1)))
)
)



(define (zahlListe zahl)
(if (null? zahl) '()
(list (digit zahl 1)))
(zahlListe zahl hier müsste ich ja sagen er soll in der Position der Zahl einen weiter gehen)

)

Und genau da liegt mein Problem, wie kriege ich das hin? Hab jez schon soviel rumprobiert das ich mitlerweile völlig verwirrt bin, also bitte helft mir =(

jbr

Unregistered

2

Tuesday, January 18th 2011, 6:43pm

(define (lzahl _zahl)
(define (helper zahl lst)
(if (< zahl 10)
(append lst zahl)
(helper (/ (- zahl (remainder zahl 10)) 10) (append lst (remainder zahl 10)))) ))
(helper _zahl '()))

irgendwie so - hab die Klammern jetzt nicht gezählt

This post has been edited 1 times, last edit by "jbr" (Jan 18th 2011, 6:43pm)


RParchmann

Praktikant

  • "RParchmann" is male

Posts: 10

Date of registration: Jul 23rd 2007

3

Tuesday, January 18th 2011, 6:50pm

kurze Lösung

wie wäre es mit


(define (zahl->liste n)
(if (= 0 n) '()
(cons (remainder n 10) (zahl->liste (quotient n 10)))))

oder, wenn die Reihenfolge anders herum sein sollte

(define (zahl->liste n)
(if (= 0 n) '()
(append (zahl->liste (quotient n 10)) (list (remainder n 10)))))

Ist doch gar nicht so schwer, oder??

vogelj

Yahniggck Pføgæhl

  • "vogelj" is male

Posts: 107

Date of registration: Oct 11th 2010

Location: Hannover, Nordstadt

4

Tuesday, January 18th 2011, 7:08pm

Source code

1
2
3
4
5
6
7
8
9
10
(define (zahlListe zahl)
  (define (helper zahl res)
     (if (= zahl 0)
       res
      (helper (quotient zahl 10) (cons (remainder zahl 10) res))
     )
  )
  (helper zahl'())
)
(zahlListe 12345)


Source code

1
2
3
4
5
6
7
8
9
10
(define (digit n pos)
  (let ((n-ziffern
    (remainder n(expt 10 pos))))
    (quotient n-ziffern (expt 10 (- pos 1)))
  )
)
(define (zahlListe_ zahl)
  (reverse (map (lambda (i) (digit zahl (+ i 1))) (build-list (string-length (number->string zahl)) *)))
)
(zahlListe_ 12345)


Source code

1
2
3
4
(define (zahlListe__ zahl)
  (map string->number (map string (string->list (number->string zahl))))
)
(zahlListe__ 12345)


Anzumerken dass das Verhalten von 0 und negativen Zahlen als Eingang unterschiedlich sein müsste.

This post has been edited 3 times, last edit by "vogelj" (Jan 19th 2011, 1:05am)


  • "XoCountessoX" started this thread

Posts: 2

Date of registration: Jan 18th 2011

5

Tuesday, January 18th 2011, 7:34pm

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#lang scheme

(define (zahlListe zahl)
  (define (helper zahl res)
     (if (= zahl 0)
       res
      (helper (quotient zahl 10) (cons (remainder zahl 10) res))
     )
  )
  (helper zahl'())
)
(zahlListe 12345)


(define (digit n pos)
  (let ((n-ziffern
    (remainder n(expt 10 pos))))
    (quotient n-ziffern (expt 10 (- pos 1)))
  )
)
(define (zahlListe_ zahl)
  (reverse (map (lambda (i) (digit zahl (+ i 1))) (build-list (string-length (number->string zahl)) *)))
)
(zahlListe_ 12345)


(define (zahlListe__ zahl)
  (map string->number (map string (string->list (number->string zahl))))
)
(zahlListe__ 12345)


Anzumerken dass das Verhalten von 0 und negativen Zahlen als Eingang unterschiedlich sein müsste.
Ok soweit sogut, nur dreht er die liste hierbei nicht um =(
warum seh ich leider nicht weil reverse wird ja benutzt...

vogelj

Yahniggck Pføgæhl

  • "vogelj" is male

Posts: 107

Date of registration: Oct 11th 2010

Location: Hannover, Nordstadt

6

Tuesday, January 18th 2011, 7:49pm

Source code

1
2
3
4
5
6
7
8
9
10
(define (zahlListe zahl)
  (define (helper zahl res)
     (if (= zahl 0)
      (reverse res)
      (helper (quotient zahl 10) (cons (remainder zahl 10) res))
     )
  )
  (helper zahl'())
)
(zahlListe 123475)


Source code

1
2
3
4
5
6
7
8
9
10
(define (digit n pos)
  (let ((n-ziffern
    (remainder n(expt 10 pos))))
    (quotient n-ziffern (expt 10 (- pos 1)))
  )
)
(define (zahlListe_ zahl)
  (map (lambda (i) (digit zahl (+ i 1))) (build-list (string-length (number->string zahl)) *))
)
(zahlListe_ 123475)


Source code

1
2
3
4
(define (zahlListe__ zahl)
  (reverse (map string->number (map string (string->list (number->string zahl)))))
)
(zahlListe__ 123475)


Das ganze nochmal gedreht. Deine "digit" Prozedur ist ziemlich komisch gestaltet weil "pos" hinten anfängt - und bei 1.
z.B.

Source code

1
2
3
4
(digit 1234 1) ;4
(digit 1234 2) ;3
(digit 1234 3) ;2
(digit 1234 4) ;1


angenommen habe ich vorher jedoch ein Verhalten wie bei list-ref, string-ref usw.:

Source code

1
2
3
4
5
6
7
(define (digit_ n pos)
  (string->number (string (string-ref (number->string n) pos)))
)
(digit_ 1234 0) ;1
(digit_ 1234 1) ;2
(digit_ 1234 2) ;3
(digit_ 1234 3) ;4


Zudem kommt es natürlich darauf an in welche Richtung du deine Paare für die Liste bildest (bzw. "apend"est).

This post has been edited 3 times, last edit by "vogelj" (Jan 19th 2011, 1:05am)


kiLLroy

Alter Hase

  • "kiLLroy" is male

Posts: 436

Date of registration: Apr 21st 2008

Location: Hannover

Occupation: CTO

7

Tuesday, January 18th 2011, 8:56pm

Damit hier mal die Diskussionen über diese hässlichen langen Lösungen weiter oben aufhört :)

wie wäre es mit


(define (zahl->liste n)
(if (= 0 n) '()
(cons (remainder n 10) (zahl->liste (quotient n 10)))))

oder, wenn die Reihenfolge anders herum sein sollte

(define (zahl->liste n)
(if (= 0 n) '()
(append (zahl->liste (quotient n 10)) (list (remainder n 10)))))

Ist doch gar nicht so schwer, oder??


Die Lösung finde ich sehr schön, gerade wegen der Kürze und der "Einfachheit" im eher technischen Sinne. Ich hätte das auch so gemacht -> hier meine Lösung in Haskell.

Source code

1
2
3
zahlZuListe 0 = []
zahlZuListe n = let(q, r) = n `quotRem` 10
    in zahlZuListe q ++ [r]


Da ist es ja auch noch ein Stück kürzer 8) Inhaltlich aber gleichwertig, denke ich zumindest.


EDIT: Ich hab gerad erst gesehen, dass Fox am Ende ja noch eine schöne Lösung hatte. Der "obvious" Ansatz in anderen Sprächen wüdre für mich genau folgender sein: "ich würde es nach string casten und dann pro zeichen splitten und wieder zurück casten" :)
Man hört ja oft verdammt gute Aussagen, prädestiniert für eine Signatur, aber jedes mal vergesse ich mir solche aufzuschreiben, darum steht hier dieser Mist...

This post has been edited 2 times, last edit by "kiLLroy" (Jan 19th 2011, 1:01am)


Kaos

Lesen, denken, flamen!

  • "Kaos" is male

Posts: 973

Date of registration: Oct 16th 2005

Location: Han. / Vahrenwald Sinnvolle Beiträge: 7

8

Wednesday, January 19th 2011, 3:53pm

Ich bin mir zwar nicht sicher wo es genau hingehört, aber vorerst verschoben in den Grundlagen-Teil da es ja scheinbar um Scheme geht. Wenn ein Mod eine bessere Idee hat. Nur zu.

Quoted

Man findet immer dort besonders viel Chaos, wo man nach Ordnung sucht. Das Chaos besiegt die Ordnung, weil es besser organisiert ist.

This post has been edited 1 times, last edit by "Kaos" (Jan 19th 2011, 3:54pm)