Dies ist eine statische Kopie unseres alten Forums. Es sind keine Interaktionen möglich.
This is a static copy of our old forum. Interactions are not possible.

kousai

Praktikant

  • "kousai" started this thread

Posts: 22

Date of registration: Sep 22nd 2009

1

Wednesday, October 28th 2009, 5:42pm

Anzahl der Ziffern in Scheme

Hallo
Ich kann leider mit einer Aufgabe nicht klar kommen !
Kann jemand mir hilfen, und zwar , ich brauche eine Idee um den Anzahl der Ziffern einer Natürlichen Zahl zu bestimmen
Ich hab versucht es so zu implementieren,
(define (count-digit n)
(round (+ ( / (log n) (log 10)) 1)))
aber es tut nicht was ich brauche
beim Testen
(count-digit 8787) --> bekomme ich 5 raus !!!



Markus

the one and only Unterstrich!

Posts: 2,571

Date of registration: Oct 9th 2003

2

Wednesday, October 28th 2009, 5:49pm

Kannst du bitte ganz normal schreiben, wie jeder andere auch? Bist sicher alt und erfahren genug, um zu wissen, wie man in Foren postet - und wie nicht.
Danke!
Charmant sein? Hab ich längst aufgegeben. Glaubt mir doch eh keiner...

Markus

the one and only Unterstrich!

Posts: 2,571

Date of registration: Oct 9th 2003

3

Wednesday, October 28th 2009, 5:52pm

Und um dir noch nen Tipp zur Aufgabenstellung zu geben, versuche es mal endrekursiv (in Fachterminus der Schemevorlesung: ) iterativ, in dem du in jedem Aufruf die übergebene Zahl durch 10 dividierst und dabei die Anzahl der Durchläufe zählt (zB als Zählvariable in einer internen Prozedur mit übergibst).

edit: Um Verwirrung mit rekursiv und iterativ erstmal zu vermeiden, programmier es einfach sich-selbst-aufrufend ;)
Charmant sein? Hab ich längst aufgegeben. Glaubt mir doch eh keiner...

This post has been edited 5 times, last edit by "Markus" (Oct 28th 2009, 5:59pm)


Kaos

Lesen, denken, flamen!

  • "Kaos" is male

Posts: 973

Date of registration: Oct 16th 2005

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

4

Wednesday, October 28th 2009, 6:30pm

Naja, genrell muss ich Markus ja recht geben: Von wem erwartest du denn bitte Hilfe, wenn dein Posting schon Kopfschmerzen bereitet? Aber auch Markus haette das mal freundlichen Ausdrücken können.

Lass das "Round" und das "Log" weg, wenn ich die Aufgabenstellung richtig lese darfst du die garnicht benutzen.

Quoted

Verwenden Sie bei der Lösung der Aufgaben nur die folgenden Befehle und Operationen: +, -, *,
/, quotient, remainder, =, >, <, >=, <=, and, or, not, abs, sqrt, min, max, define,
if, cond, display, newline


Als Hinweis von mir: Zaehl die Divisionen.
(/ 341 10)
34.1
(/ 34.1 10)
3.41
(/ 3.41 10)
0.341

(/ 100 10)
10
(/10 10)
1
(/ 1 10)
0.1

Ich hoffe es ist klar was ich sagen will...

Quoted

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

Sebastian

Trainee

  • "Sebastian" is male

Posts: 101

Date of registration: Sep 21st 2007

Location: Hannover

5

Wednesday, October 28th 2009, 6:49pm

Nen ziemlich simpler Ansatz in Pseudocode (kein Anspruch auf Korrektheit!):

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
define countdigit( n) {
vergleich = 10;
count = 1;
   define inner(n, m) {
  	if (n < m) return count;
  	else {
	    	count = count +1;
	    	vergleich = vergleich * 10;
	    	run inner(n, vergleich);
  	}
   }
run inner(n, vergleich);
}

Hat man das in den Scheme Anfängen nicht ca. so gemacht?
try {MessageBox.Show(message);} catch(Exception e) {MessageBox.Show(e.Message);}

This post has been edited 3 times, last edit by "Sebastian" (Oct 28th 2009, 7:17pm)


Kaos

Lesen, denken, flamen!

  • "Kaos" is male

Posts: 973

Date of registration: Oct 16th 2005

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

6

Wednesday, October 28th 2009, 10:28pm

Neee... So nicht Sebastian :D

Orientier dich lieber am Beispiel der Fakultätsfunktion aus der Übung:

Source code

1
2
3
4
(define (fak2 n)
  (define (iter n f)
    (if (<= n 1) f (iter (- n 1) (* n f))))
  (iter n 1))


Das ist fast identisch...

Quoted

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

Sebastian

Trainee

  • "Sebastian" is male

Posts: 101

Date of registration: Sep 21st 2007

Location: Hannover

7

Thursday, October 29th 2009, 2:52pm

Passt doch. ^^
Einfach den Pseudocode in Schemecode umwandeln, ein wenig anpassen (die vars in die Übergabe der inneren Funktion packen) und schon läufts.
try {MessageBox.Show(message);} catch(Exception e) {MessageBox.Show(e.Message);}

Xeneron

Trainee

  • "Xeneron" is male

Posts: 100

Date of registration: Sep 28th 2009

Location: Hannover Vahrenwald

8

Thursday, October 29th 2009, 6:55pm

Überleg zusätzlich auch mal was du mit der funktion remainder und quotient machen kannst. Steht sogar auf dem Übungsblatt ;)
Das Leben ist wie ein Schnitzel. Erst wirst du weich geklopft und dann in die Pfanne gehauen.

  • "Schokoholic" is male

Posts: 2,518

Date of registration: Oct 4th 2006

Location: Hannover

Occupation: Haarspaltung

9

Thursday, October 29th 2009, 8:53pm

Meine Empfehlung ist, die Aufgaben nicht nur iterativ zu lösen, sondern auch rekursiv. Immer beide Lösungswege zu implementieren hilft ungemein beim Verständnis. Zumindest auf den ersten paar Übungszetteln, bis man es wirklich verstanden hat. Die Längenfunktion die ihr schreiben sollt hat zum Beispiel genau die gleiche Struktur wie die (rekursive) Fakultätsfunktion:

Source code

1
2
3
4
(define (fak n)
  (if (<= n 1)
      1
      (* n (fak (- n 1)))))

Nämlich:
  1. Definition,
  2. Rekursionsabbruch,
  3. Anfangswert und
  4. Zurückführen auf einen anderen Wert (rekursion). Das muss nicht immer (- n 1) sein!
Dieser Vierzeiler ist so ziemlich der einfachste Fall der euch über den Weg laufen wird.