为什么递归会转到else块而不是if块?

mbzjlibv  于 2021-07-09  发布在  Java
关注(0)|答案(4)|浏览(310)
class myclass {
   static int fun(int a[],int n){
      int x;

      if(n == 1){
        return a[0];
      }
      else{
           x = fun(a, n-1);

          if(x > a[n-1])
              return x;
          else
             return a[n-1];
      }
}
 public static void main(String[] args){
     int arr[] = {12, 10, 30, 50, 100};
     System.out.println(fun(arr, 5));}
}

为什么输出是100而不是12。我不明白为什么最后一个递归调用当n的值为1时,它将阻塞else而不是if。

mqkwyuun

mqkwyuun1#

下面详细说明为什么结果是100。

public class myclass {
 static int fun(int a[],int n)
{
 int x;
 if(n == 1)
{
 return a[0];   // Step (2) --> return x = 12, now again n = 5 then continue on line        
}
 else
{
 x = fun(a, n-1); // Step (1) --> this line is same as x = fun(a, 1)
 if(x > a[n-1])     // Step (3) --> at this point n = 5 again and x = 12 while a[4] = 100 which is not less than x, statement 12 > 100 is false, move on to else block
 return x;
 else
 return a[n-1];  // Step (4) --> return a[4] which is 100 as see above
}
}
 public static void main(String[] args)
{
 int arr[] = {12, 10, 30, 50, 100};
 System.out.println(fun(arr, arr.length));}
}

希望您能够理解递归示例中缺少了什么!

3pmvbmvn

3pmvbmvn2#

n=1,x=12,12>a[0](12)-->返回a[1-1]=12
n=2。x=12,12>a[1](10)-->返回x=12;
n=3。x=12,12>a[2](30)-->返回a[3-1]=30
n=4 x=30,30>a[3](50)-->返回a[4-1]=50
n=5 x=50,50>a[4](50)-->返回a[5-1]=100

zz2j4svz

zz2j4svz3#

这是因为您在最后返回同一函数的前一个示例,因此您的方法调用和返回如下所示(每个级别的缩进都是函数调用及其返回)。如果您知道如何使用调试器,逐步检查代码,并在运行过程中查看和绘制此图表,这将有助于您在脑海中形象化递归调用和每次返回的值。

fun(a[],5) 
 |   fun(a[],4) 
 |   |   fun(a[],3)
 |   |   |  fun(a[],2)
 |   |   |   |  fun(a[],1)
 |   |   |   |  return 12
 |   |   |   return 12
 |   |   return 30
 |   return 50
 return 100
cdmah0mi

cdmah0mi4#

这是因为你在寻找数组中的最大值。改变 if(x > a[n-1])if(x < a[n-1]) 对于给定的输入,程序将返回10。

相关问题