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

Re: Java vs. Python: Rekursionstiefe

Hi! Hier mal eine Variante in C:

#include 

      int rek(int);

      int main()
      {
        printf("Starting with Recursion");
        rek(0);
      }
      int rek(int n)
      {
        printf("Depth: %d\n",n);
        n++;
        rek(n);
      }

Das ganze endet leider schon sehr früh:

[...] Depth: 523986 Segmentation fault

Comment by RoCMe Fr 22 Aug 2008 20:22:14 CEST
Re: Java vs. Python: Rekursionstiefe
Eventuell nochmal mit stacklesspython probieren ;).
Comment by allo Do 16 Okt 2008 22:31:53 CEST
Re: Java vs. Python: Rekursionstiefe

Natülich kann man unter Linux die größe des Stacks selbst festlegen. Mit ulimit -s unlimited sollte es erst mal 1:0 für C stehen.

Comment by Stefan Di 25 Nov 2008 00:08:09 CET
Add a comment