簡體   English   中英

遞歸函數如何查找數組的最小元素?

[英]How does a recursive function to find the minimum element of an array work?

我有這種使用遞歸查找數組最小值的方法,我現在正在學習。

public class findMin {
    private static int findMin(int[] data, int index) {
    int min;
    if (index == data.length - 1)//base case
    return data[index];
    min = findMin(data, index + 1);
    if (min < data[index])
    return  min;
    else
    return data[index];

    } 
}

例如,我的數組是int[] numbers = {3, 15, 1, 9, 6, 12, 21, 17, 4}; 然后從索引0開始搜索

我的問題是該方法如何拋出整個數組? 我可以看到它檢查了一下,但不是應該循環拋出整個數組嗎?

您正在談論兩種選擇

  • 使用循環遍歷數組。
  • 使用遞歸的方式訪問數組的每個元素而無需使用循環。

使用循環時,您會遇到類似

{initial data}
for({initial state} ; {stop condition} ; {incrementation} }

使用遞歸時,您會執行類似的操作。

// call the function the first time
method({initial data}, {initial state});


// inside the method it checks the condition
if ({condition})
     return {result}
else
     method({data}, {incrementation});

而且,如果您認為使遞歸看起來不必要地復雜且效率低下,那是因為Java基於過程語言,后者傾向於循環,而不是功能語言。 在函數式語言中,通常情況下遞歸更為優雅,而循環則相對困難。

我的問題是方法如何拋出整個數組?

每次該方法自身調用時,它都會遞增索引,並且條件檢查會在最后停止。

我可以看到它檢查但它不應該處於循環中以拋出整個araay嗎?

我不認為循環是解決問題的唯一方法。

注意:當有效支持遞歸時,尾遞歸優化可以將遞歸變成一個循環。 不幸的是,JVM沒有這種優化。

在行中

min = findMin(data, index + 1);

該方法會自行調用。 這使得該方法實質上遍歷了數組,因為每次該方法自身調用時,索引都會增加一個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM