簡體   English   中英

遞歸方法的結果

[英]Result of recursive method

我試圖理解這種遞歸方法,但是即使使用調試器,我也無法解決對我來說有意義的事情,因此我希望這里的人有動力向我解釋這里的情況。 我知道遞歸的工作原理,但是寫下這種方法的方式困擾着我。 我知道Java中的條件運算符,我編寫了一個新代碼,但是仍然不明白,所以我期望這里是。

m(5)和m(15)的結果是什么。 您是如何計算的? 謝謝

答案后編輯。 我整理了一張表格,供以后的讀者參考

m(n)::|0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|...
result|0|0|1|1|1|2|3|4|6|9|13|19|28|41|60|88|...

我只用程序檢查了15的結果。

public class practice {

    /**
     * Try to understand the way this works
     * @param n
     * @return 
     */
    static long m(long n) {
        return n <= 1 ? 0 : n == 2 ? 1 : m(n - 1) + m(n - 3);
    }

    /**
     * This is what i tried so far.
     * @param n
     * @return 
     */
    static long ma(long n) {

        System.out.println("Method called");
        System.out.println("N is: " + n);
        if (n <= 1) {
            System.out.println("N<=1: " + n);
            System.out.println("0 is returned");
            return 0;
        } else if (n == 2) {
            System.out.println("N==2: " + n);
            System.out.println("1 is returned");
            return 1;
        } else {
            System.out.println("Inside ELSE, N is: " + n);
            return ma(n - 1) + ma(n - 3);
        }
    }

    public static void main(String[] args) {
        ma(15);
    }

}

用這種方式編寫它,使它更易於理解:

m(0) = 0
m(1) = 0
m(2) = 1
m(n) = m(n - 1) + m(n - 3) // n >= 3

當我們知道m(0)m(1)m(2) ,我們可以使用m(n - 1) + m(n - 3)計算任何m(n) ,其中n >= 3 對於任何負輸入,結果均為0。

例如:

m(3) = m(3 - 1) + m(3 - 3) = m(2) + m(0) = 1 + 0 = 1
m(4) = m(4 - 1) + m(4 - 3) = m(3) + m(1) = 1 + 0 = 1
m(5) = m(5 - 1) + m(5 - 3) = m(4) + m(2) = 1 + 1 = 2

等等...

鉛筆和紙是您的朋友。

有3種情況(其中兩種是基本情況)

if n <= 1  then return 0

if n == 2 then return 1

else recursive call to  m(n-1) + m(n-3)

因此,您知道在每個遞歸調用中,我們都接近基本條件之一。

這是m(5)發生的堆棧跟蹤

                                m(5)
                    m(4)         +          m(2)
        m(3)         +      m(1)            return 1
m(2)     +      m(0)        return 0
return 1        return 0

將所有收益相加得出1 + 0 + 0 + 1 ,即2

所以

m(5) == 2

偽代碼中的方法m (這是某種scala / python混搭)

def m (number n)
    if (n <= 1)       0
    else if (n == 2)  1
    else              m(n - 1) + m(n - 3)

查看此內容,您可以看到<= 2任何內容都是終端操作,根據輸入返回01 如果n > 2,則樂趣開始。 n=3為例。 由於3大於2 ,因此我們需要運行第三個if 當我們看那條線時,我們看到nee返回m(n - 1) + m(n - 3) 插入n = 3后,它看起來像是: m(3 - 1) + m(3 - 3) ,或更簡單地說,是這樣的: m(2) + m(0) 現在這將以1終止,因為n 20都不會導致m更多調用。

現在我們有了一些了解,現在我們可以鍛煉m(15)m(5)會返回什么。

我只會計算5因為15的調用棧會很長

                   m(5)
              /           \
           m(5-1)   +    m(5-3)
        /         \         |
      m(4-1)  +  m(4-3)     |
    /       \       |       |
  m(3-1) + m(3-3)   |       |
    |        |      |       |
    1    +   0   +  0   +   1
                 2

希望能幫助到你!

m(5) = m(4)+m(2) // 5>2, so the third condition
m(4) + m(2) = m(3)+m(1) + 1 // 4>2, so the third condition
m(3) + m(1) + 1 = m(2)+m(0) + 0 + 1 // 3>2, so the third condition
m(2) + m(0) + 0 + 1 = 1 + 0 + 0 + 1 = 2

現在,在轉換之間, m(2)立即替換為1 ,而m(n<=1)立即替換為0 這就是您可以在紙上進行分析的方式。 但是,計算機在計算m(2)並將結果加到第一行之前會先計算m(4) -發生這種情況是由於遞歸函數中的插補順序。

暫無
暫無

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

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