This feed contains pages in the "rekursion" category.

Bei ein wenig Javaprogrammieren bot es sich an, Rekursion zu nutzen. Unerwarteterweise schmiss Java schon bei einer Rekursionstiefe von etwa 130-140 einen Stackoverflowerror. Das hat dann recht schnell den Spieltrieb geweckt, so kam folgendes Codeschnippselchen raus:

public class Rekursion {
    public static void main(String[] args) {
        System.out.println(test(0));
    }

    public static int test(int n) {
        System.out.println(n);
        return test(++n);
    }
}

Raus kam folgendes:

$ java Rekursion
0
1
2
[snip]
6882
Exception in thread "main" java.lang.StackOverflowError
    at java.lang.String.(String.java:637)
    at java.lang.Integer.toString(Integer.java:308)
    at java.lang.Integer.toString(Integer.java:116)
    at java.lang.String.valueOf(String.java:2932)
    at java.io.PrintStream.print(PrintStream.java:547)
    at java.io.PrintStream.println(PrintStream.java:686)
    at Rekursion.test(Rekursion.java:7)

Das kann Python doch bestimmt besser dachte ich mir, folgendes entstand:

def test(n):
    n+=1
    print n
    return test(n)
print test(0)

Raus kam das hier:

$ echo -e "def test(n):\n\tn+=1\n\tprint n\n\treturn test(n)\nprint test(0)" | python
1
2
3
4
5
6
...
999
Traceback (most recent call last):
  File "", line 5, in 
....
  File "", line 4, in test
RuntimeError: maximum recursion depth exceeded

Also Python kann zwar nicht mehr, aber nur weil es nicht will, also bringen wir es dazu, zu wollen :)

$ echo -e "import sys\nsys.setrecursionlimit(1000000)\ndef test(n):\n\tn+=1\n\tprint n\n\treturn test(n)\nprint test(0)" | python
1
2
3
4
5
6
7
8
...
20953
Segmentation fault
$

Aber offenbar wird Python dann ein wenig störrisch und verabschiedet sich komplett. Der Vollständigkeit halber bringt man Java auch nochmal dazu, ein wenig mehr zu wollen:

$ java -Xss128m Rekursion
0
1
2
3
....
2520128
2520129
2520130
2520131
Exception in thread "main" java.lang.StackOverflowError
    at sun.nio.cs.UTF_8$Encoder.encodeLoop(UTF_8.java:517)
    at java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:544)
    at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:252)
    at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:106)
    at java.io.OutputStreamWriter.write(OutputStreamWriter.java:190)
    at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:111)
    at java.io.PrintStream.write(PrintStream.java:476)
    at java.io.PrintStream.print(PrintStream.java:547)
    at java.io.PrintStream.println(PrintStream.java:686)
    at Rekursion.test(Rekursion.java:7)

Da kommt Java dann schlussendlich aber erheblich weiter. Allerdings wirft Python (sofern sich der Interpreter nicht komplett verabschiedet) einen weitaus spezifischeren und daher auch leichter fangbaren Fehler als Java. Trotzdem bleibt in diesem Falle als Ergebnis 1:0 für Java. (Probiert wurde das ganze auf einem Standard Ubuntu 8.04, Python: Python 2.5.2 (r252:60911, Jul 31 2008, 17:28:52), Sun Java: Java(TM) SE Runtime Environment (build 1.6.0_06-b02))

Posted Fr 22 Aug 2008 18:00:29 CEST Tags: rekursion