繁体   English   中英

Java递归函数

[英]Java recursive functions

我还不太了解递归,并且我有一些无法解决的作业。 有人有主意吗?

任务1:实现一个整数方法max(int [] arr,int i),该方法返回索引<= i的arr所有元素的最大值。

到目前为止,这是我的代码:

private static int max = 0;

private static int max(int[] arr, int i) {
    if (i >= 0 && i < arr.length) {
        if (arr[i] >= max) {
            max = arr[i];
        }

        max(arr, i - 1);
    }
    return max;
}

实际上它可以工作,但是它的样式不好,所以我的问题是:如何在没有私有static int max的情况下实现递归方法? 我不允许向该方法添加第三个参数。

任务2:实现一个布尔方法containsValue(int [] arr,int val),如果arr的元素之一与val相匹配,则返回true。 该方法应该有两个递归调用:一个搜索数组的前半部分,另一个搜索后半部分。 您可以使用Arrays.copyOfRange(...)。

这是我的代码:

private static boolean containsValue(int[] arr, int val) {
    if (arr.length > 1) {
        if (arr[arr.length - 1] == val) {
            return true;
        }
        return containsValue(Arrays.copyOfRange(arr, 0, arr.length-1), val);
    }

    return false;
}

这也有效,我知道为什么,但是显然该方法没有两次递归调用。 尝试实现将数组分为两半的方法的每一次尝试都是一个巨大的失败。 谁能帮我?

一般而言,递归需要以下结构:

if the problem is simple enough to answer easily:
   return the answer
else:
   split the problem into two parts
   recurse to get the answer
   return the answer

对于max()这是:

if the input list is of size 1:
   return the only element of the list
else
   split the list into a head (first element) and a tail (rest of the list)
   recurse to get the max of tail
   return the head or the max of tail, whichever is largest

或在Java中:

int max(int[] list) {
   if(list.length == 1) {
        return list[0];
   } else {
        return Math.max(list[0], max(tail(list)));
   }
}

(您需要使用Arrays.copyOfRange()自己实现int[] tail(int[] list) Arrays.copyOfRange()

此实现不处理零长度的输入列表-这将是无意义的调用,且结果不确定。 如果您愿意,可以使其引发更多信息。


您的第二个作业可以用基本上相同的方式编写,只不过现在有两个“简单”的案例我们不需要递归:

  • 如果输入列表为空,则答案为false
  • 如果输入列表的第一个元素是我们要查找的内容,那么答案是true
  • 否则,这并不容易,因此请递归。

所以:

boolean contains(int value, int[] list) {
   if(list.length == 0) {
        return false;
   } 

   if(list[0] == value) {
      return true;
   }

   return contains(value, tail(list));
}

...只是被告知您要递归到数组的前半部分,然后递归到数组的后半部分。 因此,按照您的指示操作:

int contains(int value, int[] list) {
   if(list.length == 0) {
      return false;
   }

   if(list.length == 1) {
       return list[0] == value;
   }

   return contains(value, firstHalf(list)) || 
          contains(value, secondHalf(list));
}

您将需要再次使用Arrays.copyOfRange()编写自己的firstHalf()secondHalf()实现。 确保当输入列表为奇数长度时,中间值仅在一半中。


请注意,这是声明性的内容-它几乎直接翻译成英语语句:“我知道如果列表为空,则不存在。如果它是列表的第一个元素,或者列表的尾部包含它,则在那里。”


请注意,在这两种情况下,递归都不是在Java中实现此功能的有效方法。 但是我敢肯定,您的老师正在引导您朝着更实际和必要的递归应用迈进。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM