簡體   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