【问题标题】:What's the shortest code to cause a stack overflow? [closed]导致堆栈溢出的最短代码是什么? [关闭]
【发布时间】:2010-09-08 21:32:47
【问题描述】:

为了纪念 Stack Overflow 的公开发布,什么是最短的导致堆栈溢出的代码?欢迎任何语言。

ETA:只是为了澄清这个问题,因为我是一个偶尔的 Scheme 用户:尾调用“递归”实际上是迭代,任何可以通过体面的编译器相对简单地转换为迭代解决方案的解决方案不会被计算在内。 :-P

ETA2:我现在选择了一个“最佳答案”;请参阅this post 了解基本原理。感谢所有贡献的人! :-)

【问题讨论】:

    标签: language-agnostic code-golf


    【解决方案1】:

    Fortran,13 和 20 个字符

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

    call main
    end
    

    第二种情况是依赖于编译器的;对于 GNU Fortran,需要使用 -fno-underscoring 编译。

    (两个计数都包括必需的换行符)

    【讨论】:

      【解决方案2】:

      Hoot 溢出!

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

      【讨论】:

        【解决方案3】:

        哈斯克尔:

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

        【讨论】:

          【解决方案4】:

          Dyalog APL

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

          【讨论】:

            【解决方案5】:
            int main(void) { return main(); }
            

            【讨论】:

            • 失败,您的答案可以进行尾调用优化。 :-P(编译器将其有效地转换为goto _main,其中_main 是与您的主函数相对应的全局符号。)
            【解决方案6】:

            PHP 是递归缩写

            【讨论】:

              【解决方案7】:

              Python:

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

              【讨论】:

              • 为什么是 sys.maxint,只需将其设置为 1,更快地崩溃...并保存字符。
              • 如果我设置recursionlimit(1),它会引发一个RuntimeError,而不是崩溃。
              【解决方案8】:

              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

              【讨论】:

              • 虽然你的答案仍然比获胜答案长 :-),但它仍然是一种非常简洁的方法,所以 +1 给你!
              • 最后,我意识到是别人先做的。它位于很难找到的中间页面。
              【解决方案9】:

              .

              【讨论】:

              • 那是什么语言?高尔夫脚本? :-)
              【解决方案10】:

              JavaScript(17 字节)

              eval(t="eval(t)")
              

              VB 脚本(25 字节)

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

              【讨论】:

                【解决方案11】:

                C++ 编译器错误信息

                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>’
                ......
                

                即使编译器通过模板,也会出现下一个错误:缺少main

                【讨论】:

                  猜你喜欢
                  • 2010-09-11
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-02-17
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-12-20
                  • 2018-07-01
                  相关资源
                  最近更新 更多