Какой самый короткий код вызывает переполнение стека?

160 Chris Jester-Young [2008-09-15 14:17:00]

В ознаменование публичного запуска Stack Overflow, какой самый короткий код вызывает переполнение стека? Любые приветствия.

ETA: просто чтобы понять этот вопрос, поскольку я являюсь случайным пользователем Схемы: "рекурсия" хвоста - это действительно итерация, и любое решение, которое может быть превращено в итеративное решение относительно тривиально приличным компилятором не будет учитываться.:-P

ETA2: теперь я выбрал "лучший ответ"; см. этот пост для обоснования. Спасибо всем, кто внес свой вклад!: -)

language-agnostic code-golf


129 ответов


213 Решение Patrick [2008-09-15 23:43:00]

Все эти ответы и отсутствие Befunge? Я бы поставил справедливое количество его кратчайшего решения из всех:

1

Не шучу. Попробуйте сами: http://www.quirkster.com/iano/js/befunge.html

EDIT: Думаю, мне нужно объяснить это. 1 операнд подталкивает 1 к внутреннему стеку Befunge, а отсутствие чего-либо еще помещает его в цикл по правилам языка.

Используя предоставленный интерпретатор, вы в конечном итоге - и я подразумеваем в конце концов - попадаем в точку, где массив Javascript, представляющий стек Befunge, становится слишком большим для перераспределения браузера. Если у вас был простой интерпретатор Befunge с меньшим и ограниченным стеком - как в случае с большинством языков ниже - эта программа приведет к более заметному переполнению быстрее.


292 jrudolph [2008-09-15 19:05:00]

Прочитайте эту строку и сделайте то, что она говорит дважды.


174 GateKiller [2008-09-15 14:53:00]

Вы также можете попробовать это на С#.net

throw new StackOverflowException();

160 Cody Brocious [2008-09-15 15:25:00]

Nemerle

Этот выдает компилятор с помощью StackOverflowException:

def o(){[o()]}

119 Chris Jester-Young [2008-09-15 14:17:00]

Мое самое лучшее (в сборке x86):

push eax
jmp short $-1

что приводит к 3 байтам объектного кода (50 EB FD). Для 16-битного кода это также возможно:

call $

что также приводит к 3 байтам (E8 FD FF).


113 Adam Davis [2009-02-28 05:17:00]

PIC18

Ответ PIC18, заданный TK, приводит к следующим инструкциям (двоичным):

overflow
   PUSH
   0000 0000 0000 0101
   CALL overflow
   1110 1100 0000 0000
   0000 0000 0000 0000

Однако CALL самостоятельно выполняет переполнение стека:

CALL $
1110 1100 0000 0000
0000 0000 0000 0000

Меньше, быстрее PIC18

Но RCALL (относительный вызов) по-прежнему меньше (не глобальная память, поэтому нет необходимости в дополнительных 2 байтах):

RCALL $
1101 1000 0000 0000

Итак, самый маленький на PIC18 - это одна команда, 16 бит (два байта). Это займет 2 цикла инструкций для каждого цикла. В течение 4 тактов за цикл инструкций у вас есть 8 тактов. PIC18 имеет 31 уровень стека, поэтому после 32-го цикла он переполнит стек в 256 тактов. На 64 МГц вы бы переполнили стек в 4 микросекунды и 2 байта.

PIC16F5x (еще меньше и быстрее)

Однако в серии PIC16F5x используются 12-битные команды:

CALL $
1001 0000 0000

Опять же, два цикла инструкций для каждого цикла, 4 такта на инструкцию, так что 8 тактов за цикл.

Однако PIC16F5x имеет двухуровневый стек, поэтому в третьем цикле он будет переполняться в 24 инструкциях. На 20 МГц он будет переполняться в 1,2 микросекундах и 1,5 байта.

Intel 4004

Intel 4004 содержит инструкцию подпрограммы 8 бит:

CALL $
0101 0000

Для любопытного, что соответствует ascii 'P'. С трехуровневым стекем, который занимает 24 тактовых цикла в общей сложности 32,4 микросекунды и один байт. (Если вы не разгоняете свой 4004 - продолжайте, вы знаете, что хотите.)

Который такой же маленький, как и ожидающий ответ, но намного, намного быстрее, чем код befunge, запущенный в текущих интерпретаторах.


77 aku [2008-09-15 14:21:00]

С#:

public int Foo { get { return Foo; } }

57 Juliet [2010-04-21 04:25:00]

Переполнение Hoot!

//              v___v
let rec f o = f(o);(o)
//             ['---']
//             -"---"-

56 Konrad Rudolph [2008-09-16 11:36:00]

Каждая задача нуждается в правильном инструменте. Знакомьтесь с SO Overflow, оптимизированным для создания:

so

42 Pi. [2008-09-16 04:10:00]

TeX:

\def~{~.}~

Результаты в:

! TeX capacity exceeded, sorry [input stack size=5000].
~->~
    .
~->~
    .
~->~
    .
~->~
    .
~->~
    .
~->~
    .
...
<*> \def~{~.}~

LaTeX:

\end\end

Результаты в:

! TeX capacity exceeded, sorry [input stack size=5000].
\end #1->\csname end#1
                      \endcsname \@checkend {#1}\expandafter \endgroup \if@e...
<*> \end\end

35 Dennis Munsie [2008-09-15 20:00:00]

Ассемблер Z-80 - в ячейке памяти 0x0000:

rst 00

один байт - 0xC7 - бесконечный цикл нажатия текущего ПК в стек и переход к адресу 0x0000.


29 Kemal [2008-09-15 23:03:00]

Другой пример PHP:

<?
require(__FILE__);

29 Vinko Vrsalovic [2008-09-15 14:39:00]

По-английски:

recursion = n. See recursion.

26 stusmith [2008-09-15 15:24:00]

Как насчет следующего в BASIC:

10 GOSUB 10

(У меня нет интерпретатора BASIC, я боюсь, так что думаю).


26 Chris Jester-Young [2008-09-15 15:33:00]

Я любил Cody ответить кучи, так что вот мой аналогичный вклад, в С++:

template <int i>
class Overflow {
    typedef typename Overflow<i + 1>::type type;
};

typedef Overflow<0>::type Kaboom;

Не для входа в гольф для кодов каким-либо образом, но все же, для переполнения мета-стека!:-P


21 Chris Jester-Young [2008-09-15 14:46:00]

Здесь мой вклад C, весом в 18 символов:

void o(){o();o();}

Это намного сложнее оптимизировать хвост!:-P


19 Jude Allred [2008-09-16 05:48:00]

Использование пакетного файла Window с именем "s.bat":

call s

17 Travis Wilson [2008-09-15 20:15:00]

Javascript

Чтобы обрезать еще несколько персонажей и вытащить себя из большего количества магазинов программного обеспечения, отпустите:

eval(i='eval(i)');

15 Greg [2009-06-22 22:09:00]

Скажите, пожалуйста, что означает аббревиатура GNU".


15 Chris Broadfoot [2008-09-15 19:24:00]

Groovy:

main()

$groovy stack.groovy:

Caught: java.lang.StackOverflowError
    at stack.main(stack.groovy)
    at stack.run(stack.groovy:1)
 ...

14 Ryan Fox [2008-09-16 05:38:00]

Person JeffAtwood;
Person JoelSpolsky;
JeffAtwood.TalkTo(JoelSpolsky);

Здесь надеюсь на отсутствие рекурсии хвоста!


12 bk1e [2008-09-15 18:14:00]

C - это не кратчайший, но без рекурсии. Он также не переносится: он падает в Solaris, но некоторые реализации alloca() могут возвращать здесь ошибку (или вызвать malloc()). Требуется вызов printf().

#include <stdio.h>
#include <alloca.h>
#include <sys/resource.h>
int main(int argc, char *argv[]) {
    struct rlimit rl = {0};
    getrlimit(RLIMIT_STACK, &rl);
    (void) alloca(rl.rlim_cur);
    printf("Goodbye, world\n");
    return 0;
}

11 user8456 [2008-09-15 19:18:00]

попробуйте поставить более 4 пирожков на одном гамбургере. переполнение стека.


11 Cody Brocious [2008-09-15 14:30:00]

Python

so=lambda:so();so()

В качестве альтернативы:

def so():so()
so()

И если оптимизированные хвосты Python...:

o=lambda:map(o,o());o()

11 asksol [2008-09-15 15:39:00]

perl в 12 символах:

$_=sub{&$_};&$_

bash в 10 символах (важно место в функции):

i(){ i;};i

10 Chris Jester-Young [2008-09-16 15:48:00]

Я выбираю "лучший ответ" после этого сообщения. Но сначала я хотел бы отметить некоторые очень оригинальные вклады:

  • aku. Каждый из них исследует новый и оригинальный способ возникновения. Идея делать f (x) ⇒ f (f (x)) является той, которую я расскажу в следующей статье ниже.: -)
  • Cody, который дал компилятору Nemerle переполнение стека.
  • И (немного неохотно), GateKiller один о том, чтобы выбросить исключение. -Р

Как мне нравится вышеизложенное, задача состоит в том, чтобы делать код в гольф, и, чтобы быть справедливым для респондентов, я должен присудить "лучший ответ" кратчайшему коду, который является записью Befunge; Я не верю, что кто-то сможет победить это (хотя Конрад, конечно же, попытался), так поздравляю Патрика!

Увидев большое количество решений, я удивлен, что никто (на момент написания письма) не поднял Y combinator (см. эссе Dick Gabriel, Почему Y, для праймера). У меня есть рекурсивное решение, которое использует подход Y combinator, а также aku f (f (x)).: -)

((Y (lambda (f) (lambda (x) (f (f x))))) #f)

8 Adam Rosenfield [2008-09-16 22:26:00]

Вот еще один интересный из Схемы:

((lambda (x) (x x)) (lambda (x) (x x)))

7 Misha [2008-09-15 17:41:00]

Java

Немного более короткая версия решения Java.

class X{public static void main(String[]a){main(a);}}

6 [2008-09-15 18:20:00]

xor esp, esp
ret

5 Anders Sandvig [2008-09-15 16:22:00]

3 байта:


label:
  pusha
  jmp label

Обновление

Согласно (старой?) документации Intel (?), это также 3 байта:


label:
  call label

4 Evan DeMond [2008-09-15 17:15:00]

В Lua:

function f()return 1+f()end f()

Вам нужно что-то сделать для результата рекурсивного вызова, иначе оптимизация хвостовых вызовов позволит ему зацикливаться навсегда. Слабый для кодового гольфа, но приятно иметь!

Я предполагаю, что и длинные ключевые слова означают, что Lua в ближайшее время не выиграет гольф-код.


4 Manrico Corazzi [2008-09-15 15:43:00]

Java (смущение):

public class SO 
{ 
  private void killme()
  {
    killme();
  }

  public static void main(String[] args) 
  { 
    new SO().killme(); 
  } 
}

ИЗМЕНИТЬ Конечно, это может быть значительно сокращено:

class SO
{
  public static void main(String[] a)
  {
    main(null);
  }
}

4 [2008-09-15 23:14:00]

как локальная переменная в функции C:

int x[100000000000];

4 Pi. [2008-09-15 22:41:00]

Forth:

: a 1 recurse ; a

Внутри интерпретатора gforth:

: a 1 recurse ; a 
*the terminal*:1: Return stack overflow
: a 1 recurse ; a
                ^
Backtrace:

На Power Mac G4 в приглашении Open Firmware это просто повесит машину.:)


3 [2008-09-15 19:15:00]

Ruby, короче, чем другие:

def a;a;end;a

(13 символов)


3 Tim Ring [2008-09-15 16:47:00]

Выход GWBASIC...

OK
10 i=0
20 print i;
30 i=i+1
40 gosub 20
run
 0  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  31  32  33
Out of memory in 30
Ok

Не так много глубины стека: -)


3 dr_bonzo [2008-09-15 15:26:00]

Ruby:

def s() s() end; s()

3 Kyle Cronin [2008-09-15 17:43:00]

В схеме это приведет к тому, что у интерпретатора закончится нехватка памяти:

(define (x)
  ((x)))

(x)

3 Jay Bazuzi [2008-09-15 23:34:00]

С#

class _{static void Main(){Main();}}

Обратите внимание, что моя - это компилируемая программа, а не только одна функция. Я также удалил лишние пробелы.

Для таланта я сделал имя класса как можно меньше.


3 user4010 [2008-09-16 02:54:00]

Если вы считаете, что кадр вызова является процессом, а стек - вашей машиной Unix, вы можете считать, что вилка-бомба является параллельной программой для создания условия. Попробуйте этот 13-символьный номер bash. Не требуется сохранение файла.

:(){ :|:& };:

3 tomdemuyt [2008-09-15 17:16:00]

пакетная программа, называемая call.cmd;

вызов call.cmd

******  B A T C H   R E C U R S I O N  exceeds STACK limits ******
Recursion Count=1240, Stack Usage=90 percent
******       B A T C H   PROCESSING IS   A B O R T E D      ******

3 Wouter Coekaerts [2008-09-16 10:49:00]

В Irssi (клиент на основе терминала IRC, а не "действительно" язык программирования), $L означает текущую командную строку. Таким образом, вы можете вызвать переполнение стека ( "максимальный предел рекурсии" ) с помощью:

/eval $L


2 KirarinSnow [2010-02-07 09:21:00]

PostScript, 7 символов

{/}loop

При запуске в GhostScript выдает это исключение:

GS>{/}loop
Error: /stackoverflow in --execute--
Operand stack:
   --nostringval--
Execution stack:
   %interp_exit   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--   --nostringval--   %loop_continue   1753   2   3   %oparray_pop   --nostringval--   --nostringval--   false   1   %stopped_push   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--   --nostringval--   %loop_continue
Dictionary stack:
   --dict:1150/1684(ro)(G)--   --dict:0/20(G)--   --dict:70/200(L)--
Current allocation mode is local
Last OS error: 11
Current file position is 8

Здесь рекурсивная версия без использования переменных (51 символ):

[{/[aload 8 1 roll]cvx exec}aload 8 1 roll]cvx exec

2 Draemon [2010-02-27 21:48:00]

Java:

class X{static{new X();}{new X();}}

На самом деле вызывает переполнение стека, инициализирующее класс X. Перед вызовом main() JVM должен загрузить класс, а когда он делает это, он запускает любые анонимные статические кодовые блоки:

static {
  new X();
}

Который, как вы можете видеть, создает экземпляр X, используя конструктор по умолчанию. JVM будет вызывать анонимные блоки кода еще до конструктора:

{
  new X();
}

Какая рекурсивная часть.


2 gha.st [2010-01-20 17:07:00]

С#

class Program
{
    class StackOverflowExceptionOverflow : System.Exception
    {
        public StackOverflowExceptionOverflow()
        {
            throw new StackOverflowExceptionOverflow();
        }
    }

    static void Main(string[] args)
    {
        throw new StackOverflowExceptionOverflow();
    }
}

Я понимаю, что это не самый короткий (и даже код в гольф не близок к тому, чтобы быть рядом с коротким), но я просто не мог удержаться от исключения, что при броске выбрасывает исключение stackoverflowexception, прежде чем оно сможет завершить сама среда выполнения ^^


2 Andrew Johnson [2008-09-15 15:37:00]

a{return a*a;};

Скомпилировать с помощью:

gcc -D"a=main()" so.c

Расширяется до:

main() {
    return main()*main();
}

2 TK. [2008-09-15 14:34:00]

PIC18:

Переполнение

    PUSH   
    CALL   overflow 

2 Robert S. [2008-09-15 17:53:00]

В пробеле, я думаю:

Вероятно, он не появится.:/


2 Ozgur Ozcitak [2008-09-15 15:35:00]

Lisp

(defun x() (x)) (x)

2 Ming-Tang [2010-07-17 22:03:00]

Java: 35 символов

Я думаю, что это слишком поздно, но я все равно напишу свою идею:

class A{{new A();}static{new A();}}

Использование функций инициализатора статического инициализатора и экземпляра.

Вот вывод на моем компьютере (обратите внимание, что он показал два сообщения об ошибках):

Exception in thread "main" java.lang.StackOverflowError
    at A.<init>(A.java:1)
        ......
    at A.<init>(A.java:1)
Could not find the main class: A. Program will exit.

Смотрите также: http://download.oracle.com/docs/cd/E17409_01/javase/tutorial/java/javaOO/initial.html


2 Joshua Carmody [2008-09-15 21:04:00]

Ну, никто еще не упомянул Coldfusion, так что...

<cfinclude template="#ListLast(CGI.SCRIPT_NAME, "/\")#">

Это должно сделать это.


2 matyr [2008-09-17 08:45:00]

Groovy (5B):

run()

2 Cody Brocious [2008-09-15 14:53:00]

КСС /MSIL

loop: ldc.i4.0
br loop

Код объекта:

16 2B FD

2 mattiast [2008-09-15 20:45:00]

Haskell:

let x = x
print x

2 Ming-Tang [2010-08-31 04:02:00]

Сообщение об ошибке компилятора С++

template<int n>struct f{f<n+1>a;};f<0>::a;

выход:

$ g++ test.cpp;
test.cpp:1: error: template instantiation depth exceeds maximum of 500 (use -ftemplate-depth-NN to increase the maximum) instantiating ‘struct f<500>’
test.cpp:1:   instantiated from ‘f<499>’
test.cpp:1:   instantiated from ‘f<498>’
......

Даже если компилятор прошел через шаблон, появится следующая ошибка: missing main.


2 aku [2008-09-15 16:51:00]

F #

Люди продолжают спрашивать: "Для чего полезно F #?"

let rec f n =
    f (n)

оптимизированная по производительности версия (будет работать быстрее:))

let rec f n =
    f (f(n))

2 clahey [2008-09-16 01:31:00]

Если не существует языка, в котором пустая программа вызывает переполнение стека, следующее должно быть как можно короче.

Befunge:

:

Дублирует значение верхнего стека снова и снова.

изменить:  Патрик лучше. Заполнение стека 1 сек лучше, чем заполнение стека 0, поскольку интерпретатор может оптимизировать нажатие 0s на пустой стек как нет-op.


1 Agnel Kurian [2008-09-15 14:42:00]

/* In C/C++ (second attempt) */

int main(){
    int a = main() + 1;
    return a;
}

1 botismarius [2008-09-15 19:45:00]

В языке ассемблера (процессоры x86, 16 или 32-битный режим):


call $

который будет генерировать:

  • в 32-битном режиме: 0xe8; 0xfb; 0xff; 0xff; 0xff

  • в 16-битном режиме: 0xe8; 0xfd; 0xff

в C/С++:


int main( ) {
  return main( );
}

0 wash [2010-06-12 18:55:00]

Dyalog APL

fib←{
    ⍵∊0 1:⍵
    +/∇¨⍵-1 2
}

0 [2008-09-17 04:42:00]

В сборке x86 поместите инструкцию деления на 0 в место в памяти обработчика прерываний для деления на 0!


0 [2008-09-15 19:17:00]

Довольно много любой оболочки:

sh $0

(5 символов, работает только при запуске из файла)


0 Kibbee [2008-09-15 21:14:00]

VB.Net

Function StackOverflow() As Integer
    Return StackOverflow()
End Function

0 Carlos Gutiérrez [2010-02-26 21:10:00]

Еще один пакет Windows:

:a
@call :a

0 Kaarel [2009-02-25 00:21:00]

Prolog

Эта программа аварийно завершает работу с SWI-Prolog и Sicstus Prolog.

p :- p, q.
:- p.

-1 Daniel Spiewak [2008-09-16 04:24:00]

Я думаю, что это будет работать на Java (не проверено):

enum A{B.values()}
enum B{A.values()}

Должен переполняться в статической инициализации, прежде чем он даже получит шанс выйти из строя из-за отсутствия основного (String []).


-1 WaldWolf [2008-09-15 23:12:00]

Prolog

р:-p.

= 5 символов

затем запустите его и запросите p

Я думаю, что он довольно мал и заканчивается в прологе.

запрос только переменной в прологе swi производит:

? - X. %... 1 000 000............ 10 000 000 лет спустя % % → 42 < (последний выпуск дает вопрос)

и вот еще одна боковая вилка bash: :() {: |: & };


-1 [2008-09-15 17:01:00]

Ruby:

def i()i()end;i()

(17 символов)


-4 Oscar Cabrero [2009-02-28 04:52:00]

Redmond.Microsoft.Core.Windows.Start()

-6 [2008-09-15 22:49:00]

Упс, я не знаю, я никогда не писал код, который вызывает переполнение стека;)


0 Daniel Băluţă [2010-06-12 19:07:00]

int main(void) { return main(); }

0 Artur Gaspar [2010-07-12 20:19:00]

Python:

import sys  
sys.setrecursionlimit(sys.maxint)  
def so():  
    so()  
so()

0 Agnel Kurian [2008-09-15 14:36:00]

int main(){
    int a = 20;
    return main();
}

0 GateKiller [2008-09-15 14:47:00]

С#, выполненный в 20 символах (исключая пробелы):

int s(){
    return s();
}

0 N 1.1 [2010-02-27 00:36:00]

main(){
   main();
}

Простое и приятное C. Чувствует себя достаточно интуитивным для меня.


0 PersistenceOfVision [2008-09-15 23:05:00]

Для развлечения мне пришлось посмотреть сборку Motorolla HC11:

              org           $100
Loop    nop
          jsr            Loop

0 [2008-09-15 16:19:00]

В ячейке spus нет переполнений стека, поэтому нет необходимости в рекурсии, мы можем просто стереть указатель стека.

asm ( "andi $1, $1, 0" );


0 user11039 [2008-09-16 07:23:00]

В С# это создаст stackoverflow...

static void Main()
{
    Main();
}

0 Despatcher [2008-09-16 01:53:00]

Я думаю, что это мошенничество, с которым я никогда не играл раньше;), но здесь идет

8086 ассемблер:

org Int3VectorAdrress - это обман?

int 3

1 байт - или 5 символов, которые генерируют код, что скажете?


0 [2008-09-15 19:09:00]

bash: Только один процесс

\#!/bin/bash
of() { of; }
of

0 RFelix [2008-09-16 03:25:00]

Ruby, хотя и не такой короткий:

class Overflow
    def initialize
        Overflow.new
    end
end

Overflow.new

0 st0le [2010-07-27 16:12:00]

JavaScript (17 байт)

eval(t="eval(t)")

VB Script (25 байт)

t="Execute(t)":Execute(t)

0 mike511 [2008-09-16 08:22:00]

почему не

mov sp,0

(стек растет)


0 Mark Nold [2008-09-16 08:37:00]

В файле PostScript, который называется so.ps, вызывает execstackoverflow

%!PS
/increase {1 add} def
1 increase
(so.ps) run

0 David B [2008-09-15 18:17:00]

С# с 27 символами без пробелов - включает вызов.

Action a = null;
a = () => a();
a();

0 bgee [2008-09-15 16:48:00]

//lang = C++... it joke, of course
//Pay attention how 
void StackOverflow(){printf("StackOverflow!");}
int main()
{
    StackOverflow(); //called StackOverflow, right?
}

0 Jonas Gulle [2008-09-15 19:27:00]

Пять байтов в 16-разрядном asm, которые вызовут переполнение стека.

push cs
push $-1
ret

0 F'x [2010-03-07 17:46:00]

Фортран, 13 и 20 символов

real n(0)
n(1)=0
end

или

call main
end

Второй случай зависит от компилятора; для GNU Fortran его нужно будет скомпилировать с помощью -fno-underscoring.

(Оба подсчета включают требуемые символы перевода строки)


0 defmeta [2008-09-17 01:46:00]

ActionScript 3: все сделано с массивами...

var i=[];
i[i.push(i)]=i;
trace(i);

Возможно, не самый маленький, но я думаю, что это мило. Особенно метод push возвращает новую длину массива!


0 Huppie [2008-09-15 14:37:00]

JavaScript:

function i(){ i(); }
i();


С++ Использование указателя функции:
int main(){
   int (*f)() = &main;
   f();
}

0 jkramer [2010-05-25 14:40:00]

Haskell:

main = print $ x 1 where x y = x y + 1

0 davidnicol [2008-09-15 17:27:00]

MS-DOS:

copy CON so.bat
so.bat
^Z
so.bat

0 Niyaz [2008-09-15 14:20:00]

С++

int overflow(int n)
{
    return overflow(1);
}

0 BCS [2009-04-22 23:36:00]

Мета-проблема в D:

class C(int i) { C!(i+1) c; }
C!(1) c;

Слишком много времени



0 JWHEAT [2008-09-15 16:35:00]

PHP - рекурсия просто для удовольствия. Я предполагаю, что PHP-интерпретатор выводит его из работы, но эй - это приведет к сбою.

function a() { a(); } a();

0 Kinjal Dixit [2008-09-15 16:01:00]

рекурсия - старая шляпа. вот взаимная рекурсия. начать с вызова любой из функций.

a()
{
    b();
}
b()
{
    a();
}

PS: но вы просили кратчайший путь... не самый креативный путь!


0 Graphics Noob [2009-11-15 00:34:00]

OCaml

let rec f l = f l@l;;

Это немного другое. В стеке есть только один стек стека (поскольку он рекурсивно хвост), но он продолжает расти, пока не переполнит стек. Просто позвоните f с таким непустым списком (в приглашении переводчика):

# f [0];;
Qaru during evaluation (looping recursion?).


0 finnw [2010-01-31 22:39:00]

ruby ​​(снова):

def a(x);x.gsub(/./){a$0};end;a"x"

Есть много рубиновых решений уже, но я думал, что я бы выбрал регулярное выражение для хорошей оценки.


1 aku [2008-09-15 15:37:00]

С# снова:

class Foo { public Foo() {new Foo(); } }

1 Antti Sykäri [2008-09-15 15:46:00]

so.c в 15 символов:

main(){main();}

Результат:

antti@blah:~$ gcc so.c -o so
antti@blah:~$ ./so
Segmentation fault (core dumped)

Изменить. Хорошо, он дает предупреждения с -Wall и не вызывает переполнение стека с -O2. Но это работает!


1 Michal [2008-09-15 16:13:00]

Java (полное содержимое X.java):

class X {
public static void main(String[] args) {
    main(null);
}}

Учитывая весь синтаксический сахар, мне интересно, можно ли сделать что-то более короткое в Java. Кто-нибудь?

РЕДАКТИРОВАТЬ: Ой, я пропустил, уже отправлено почти идентичное решение.

РЕДАКТИРОВАТЬ 2: Я бы сказал, что этот (как мудрый) самый короткий

class X{public static void main(String[]a){main(null);}}

РЕДАКТИРОВАТЬ 3: Благодаря Anders для указания нулевого значения не является оптимальным аргументом, поэтому сделать это короче:

class X{public static void main(String[]a){main(a);}}

1 Jesse Millikan [2008-09-15 16:59:00]

У меня есть список из них в Бесконечный цикл на E2 - см. только те, которые обозначены как "Переполнение стека" в заголовке.

Я думаю, что самый короткий из них -

[dx]dx

в dc. Может быть более короткое решение в False.

EDIT: По-видимому, это не работает... По крайней мере, на GNU dc. Возможно, это было в версии BSD.


1 Antti Sykäri [2008-09-15 17:44:00]

Shell script решение в 10 символов, включая символы новой строки:

Ну, технически не переполнение стека, а логически так, если вы рассматриваете возможность создания нового процесса как создания нового фрейма стека.

#!sh
./so

Результат:

antti@blah:~$ ./so
[disconnected]

Упс. Примечание: не пробуйте это дома


1 Joseph Bui [2008-09-15 21:50:00]

TCL:

proc a {} a

У меня нет интерпретатора tclsh, который может выполнять хвостовую рекурсию, но это может обмануть такую ​​вещь:

proc a {} "a;a"

1 JosephStyons [2008-09-15 15:40:00]

Завершить программу Delphi.

program Project1;
{$APPTYPE CONSOLE}
uses SysUtils;

begin
  raise EStackOverflow.Create('Stack Overflow');
end.

1 [2009-02-20 21:49:00]

Переполнение CMD в одной строке

echo @call b.cmd > b.cmd & b

1 Leo Lännenmäki [2008-09-15 16:00:00]

Javasript:

Huppies отвечают на одну строку:

(function i(){ i(); })()

То же количество символов, но не новая строка:)


1 x0n [2008-09-15 18:36:00]

PowerShell

$F = {& $F}; & $е

"Ошибка script из-за переполнения глубины вызова. Глубина вызова достигла 1001, а максимальная - 1000.


1 Leo Lännenmäki [2008-09-16 16:04:00]

Другой в JavaScript:

(function() { arguments.callee() })()

1 Aardappel [2008-09-18 11:41:00]

False

[1] [1] #

(False - это язык стека: # - это цикл while, который принимает 2 замыкания, условное и тело. Тело - это тот, который вызывает переполнение).


1 squadette [2008-09-16 22:21:00]

Короткое решение в K & R C может быть скомпилировано:

main(){main()}

14 байт


1 Cyclone [2010-07-03 16:18:00]

PHP является рекурсивным акронимом


1 user10178 [2008-09-16 04:35:00]

не будет самым коротким, но мне пришлось попробовать что-то... С#

string [] f = новая строка [0]; Основной (е);

бит короче

static void Main(){Main();}

1 RFelix [2008-09-16 13:14:00]

Здесь другой ответ Ruby, этот использует lambdas:

(a=lambda{a.call}).call

1 Javier [2008-09-16 17:35:00]

VB6


Public Property Let x(ByVal y As Long)
  x = y
End Property

Private Sub Class_Initialize()
  x = 0
End Sub

1 [2008-09-17 04:24:00]

В ответ на комментарий Y combinator я мог бы также пройти через Y-combinator в исчислении SKI:

S (K (S I I)) (S (S (K S) K) (K (S I I)))

Нет никаких интерпретаторов SKI, о которых я знаю, но однажды написал графический пример примерно через час в ActionScript. Я бы хотел опубликовать, если есть интерес (хотя я никогда не получал макет, работающий очень эффективно)

прочитайте все о нем здесь: http://en.wikipedia.org/wiki/SKI_combinator_calculus


1 dsm [2008-09-18 09:31:00]

в perl:

`$0`

По сути, это будет работать с любой оболочкой, которая поддерживает синтаксис backquote-command и сохраняет свое собственное имя в $0


1 Jonas Kölker [2009-03-03 13:55:00]

В Haskell

fix (1+)

Это пытается найти точку исправления функции (1+) (λ n → n + 1). Реализация исправления

fix f = (let x = f(x) in x)

Итак,

fix (1+)

становится

(1+) ((1+) ((1+) ...))

Обратите внимание, что

fix (+1)

просто петли.


1 nobar [2010-02-27 21:08:00]

GNU make:

Создайте файл под названием "Makefile" со следующим содержимым:

a:
    make

Затем запустите make:

$ make

Обратите внимание, что для смещения слова "make" следует использовать символ табуляции. Этот файл имеет 9 символов, включая 2 символа конца строки и 1 символ табуляции.

Я полагаю, вы могли бы сделать аналогичную вещь с bash, но, вероятно, слишком легко быть интересным:

Создайте имя файла "b" и отметьте его как исполняемый файл (chmod + x b):

b ## ties the winning entry with only one character (does not require end-of-line)

Теперь выполните файл с

$ ( PATH=$PATH:. ; b )

Трудно сказать, технически ли этот подход приводит к переполнению стека, но он создает стек, который будет расти до тех пор, пока машина не исчерпает ресурсы. Замечательная вещь о том, как это сделать с GNU make, заключается в том, что вы можете смотреть информацию о статусе вывода, когда он создает и уничтожает стек (если вы нажмете ^ C в какой-то момент до возникновения сбоя).



0 Tim Ring [2009-12-31 18:04:00]

Язык ассемблера Z80...

.org 1000
loop: call loop

это генерирует 3 байта кода в месте 1000....

1000 CD 00 10


0 Thevs [2008-09-15 23:29:00]

Не очень короткий, но эффективный! (JavaScript)

setTimeout(1, function() {while(1) a=1;});

0 Svante [2009-02-28 06:49:00]

Оптимизация звонков может быть саботирована, а не вызывает вызов. В Common Lisp:

(defun f () (1+ (f)))

0 Graphics Noob [2009-11-16 00:26:00]

Даже если на самом деле он не имеет стека...

brainf * ck 5 char

+[>+]

0 davidnicol [2008-09-15 17:21:00]

Perl в 10 символах

sub x{&x}x

В конечном итоге использует всю доступную память.


0 Alnitak [2008-09-15 15:57:00]

Я попытался сделать это в Erlang:

c(N)->c(N+1)+c(N-1).
c(0).

Двойной вызов самого себя увеличивает использование памяти O(n^2), а не O(n).

Однако интерпретатору Erlang, похоже, не удается сбой.