Was ist der kürzeste Code, um einen Stapelüberlauf auszulösen, um an den öffentlichen Start von Stack Overflow zu erinnern? Jede Sprache ist willkommen.
ETA: Nur um bei dieser Frage klar zu sein, da ich ein gelegentlicher Scheme-Benutzer bin: Tail-Call "Rekursion" ist wirklich eine Iteration, und jede Lösung, die von einem anständigen Compiler relativ trivial in eine iterative Lösung umgewandelt werden kann, wird dies nicht tun gezählt werden. :-P
ETA2: Ich habe jetzt eine "beste Antwort" ausgewählt. Siehe dieser Beitrag für die Begründung. Vielen Dank an alle, die dazu beigetragen haben! :-)
Actionscript 3: Alles erledigt mit Arrays ...
var i=[];
i[i.Push(i)]=i;
trace(i);
Vielleicht nicht die kleinste, aber ich finde es süß. Insbesondere die Push-Methode, die die neue Array-Länge zurückgibt!
OCaml
let rec f l = f [email protected];;
Dieser ist ein bisschen anders. Es gibt nur einen Stapelrahmen auf dem Stapel (da er rekursiv ist), aber seine Eingabe wächst weiter, bis er den Stapel überläuft. Rufen Sie einfach f
mit einer nicht leeren Liste auf (an der Interpreter-Eingabeaufforderung):
# f [0];;
Stack overflow during evaluation (looping recursion?).
int main(void) { return main(); }
main(){
main();
}
Plain und Nice C. Fühlt sich für mich sehr intuitiv an.
VB.Net
Function StackOverflow() As Integer
Return StackOverflow()
End Function
Nicht sehr kurz, aber effektiv! (JavaScript)
setTimeout(1, function() {while(1) a=1;});
eval(t="eval(t)")
t="Execute(t)":Execute(t)
Zum Spaß musste ich die Motorola HC11 Assembly nachschlagen:
org $100
Loop nop
jsr Loop
Eine andere Windows-Batch-Datei:
:a
@call :a
Metaproblem in D:
class C(int i) { C!(i+1) c; }
C!(1) c;
kompilierzeitstapelüberlauf
Haskell:
main = print $ x 1 where x y = x y + 1
Ruby (wieder):
def a(x);x.gsub(/./){a$0};end;a"x"
Es gibt bereits eine Menge Ruby Lösungen, aber ich dachte, ich würde für ein gutes Maß einen regulären Ausdruck einbauen.
_asm t: call t;
Ruby, wenn auch nicht so kurz:
class Overflow
def initialize
Overflow.new
end
end
Overflow.new
Auch wenn es nicht wirklich einen Stapel hat ...
brainf * ck 5 char
+[>+]
Python:
import sys
sys.setrecursionlimit(sys.maxint)
def so():
so()
so()
Ich denke, es ist Betrug, den ich noch nie zuvor gespielt habe;), aber jetzt geht es los
8086 Assembler:
org Int3VectorAdrress; ist das Betrug?
int 3
1 Byte - oder 5 Zeichen, die Code generieren, was sagen Sie?
Platzieren Sie in der x86-Assembly eine Division durch 0-Anweisung an der Stelle im Speicher des Interrupt-Handlers, an der Sie durch 0 dividieren möchten!
warum nicht
mov sp,0
(Stapel wächst runter)
Die Optimierung von Tail Calls kann durch Nicht-Tail-Calls sabotiert werden. In Common LISP:
(defun f () (1+ (f)))
Z80 Assemblersprache ...
.org 1000
loop: call loop
dadurch werden 3 Byte Code an Position 1000 generiert.
1000 CD 00 10
real n(0)
n(1)=0
end
oder
call main
end
Der zweite Fall ist vom Compiler abhängig. Für GNU Fortran muss es mit -fno-underscoring
kompiliert werden.
(Beide Zählungen beinhalten erforderliche Zeilenumbrüche)
Dyalog APL
fib←{
⍵∊0 1:⍵
+/∇¨⍵-1 2
}
Prolog
Dieses Programm bringt sowohl SWI-Prolog als auch Sicstus Prolog zum Absturz, wenn es konsultiert wird.
p :- p, q.
:- p.
In C # würde dies einen Stapelüberlauf erzeugen ...
static void Main()
{
Main();
}
In einer PostScript Datei mit dem Namen so.ps wird ein Execstackoverflow ausgelöst
%!PS
/increase {1 add} def
1 increase
(so.ps) run