2017-05-20 196 views
-2

得到了递归函数的问题。我在java中创建了这个,这只是非常基本的,但由于Stack overflow错误而不起作用。我的意思是这个函数的作用就是打开funktion,就像给定数字和你在主函数中声明的数字之间的差异一样多,这对堆栈来说应该不是什么问题,但是, t一直工作,或者这里的错误是什么......? 谢谢你的答案提前:)递归函数堆栈溢出

public class Übung_Baeume { 
    static int anzAufrufe=0; 
    static int zahl=23; 
    public static int zaehleAufrufe(int uebergabe) 
    { 
     anzAufrufe++; 
     if (uebergabe==zahl){ 
      return anzAufrufe; 
     } 


     return zaehleAufrufe(uebergabe-1) + 
      zaehleAufrufe(uebergabe+1); 

    } 

    public static void main(String[] args) { 
     System.out.println(zaehleAufrufe(40)); 
    } 
} 

回答

1

这几乎总是意味着没有任何东西可以从去越陷越深停止递归。达到一定程度的目标是否达到目标是没有条件的。

在你的代码从40开始,只有当你到23,但是你的一个分支将停止增加数:

回报zaehleAufrufe(uebergabe-1)+ zaehleAufrufe(uebergabe + 1);

,绝不会下降到23

欢迎与堆栈溢出:)

附:到计算器最好的办法是重新考虑你的算法。如果你是确定你想要使用递归,但由于取决于未知数据,它的分支是不可预知的,所以你可以设置一个限制级别的值。这是一个肮脏的黑客,但有些情况下,它是有用的。

这是importaint说,与此限制您的代码将仍然无法 - 它会尝试调用这个函数高达2^33倍=约8十亿,这是足够大:)

public class Übung_Baeume { 
    static int anzAufrufe=0; 
    static int zahl=23; 
    static int max_level = 32; 
    static bool fault = 0; 
    public static int zaehleAufrufe(int uebergabe, int level) 
    { 
     if(level == max_level) 
     { 
      fault = 1; 
      return 0; 
     } 
     anzAufrufe++; 
     if (uebergabe==zahl){ 
      return anzAufrufe; 
     } 


     return zaehleAufrufe(uebergabe-1, level+1) + 
      zaehleAufrufe(uebergabe+1, level+1); 

    } 

    public static void main(String[] args) { 

     int ret = zaehleAufrufe(40,0); 
     if(fault == 0) 
      System.out.println(ret); 
     else 
      System.out.println("Fault - recursion level limit reached!"); 
    } 
} 
1

ubergabe如果不等于23将与ubergabe +1unbergabe - 1递归。现在每个那些会做相同的,所以你可以试试这个:

zaehleAufrufe(40) ; ==> 
zaehleAufrufe(39) + zaehleAufrufe(41) ; ==> neither of these are 23 
zaehleAufrufe(38) + zaehleAufrufe(40) + zaehleAufrufe(40) + zaehleAufrufe(42) 

注意,最后一个..即使其中的一些,最终将达到基本情况你看,你在3扩张有2 zaehleAufrufe(40)。其中每一个扩展像上面的转变也成为两个zaehleAufrufe(40)并且这些中的任何一个甚至不会触及基本情况。

对于递归工作,你需要变得更简单的问题,实际上你的成为几个相同的数量,从而无限递归。

要打开的功能很多倍的差价你只递归一次:

public static int zaehleAufrufe(int uebergabe) 
{ 
    anzAufrufe++; 
    if (uebergabe <= zahl) { 
     return anzAufrufe; 
    } 
    return zaehleAufrufe(uebergabe-1); 
} 

zaehleAufrufe(40) ; ==> 
zaehleAufrufe(39) ; ==> 
... 
zaehleAufrufe(23) ; ==> 18