簡體   English   中英

JAVA遞歸程序邏輯

[英]JAVA Recursive Program logic

public class Prod {
    public static void main(String[] args) {
        System.out.println(prod(1, 4));
    }
    public static int prod(int m, int n) {
        if (m == n) {
            return n;
        } else {
            int recurse = prod(m, n-1);
            int result = n * recurse;
            return result;
        }
    }
}

運行上面的代碼,我得到24嗎? 我不太明白怎么辦?

我的疑問:1.當m = 1,n = 4時,我們調用prod直到m和n等於1。然后輸出應為n,否則不應執行塊?

有人請幫助我理解邏輯。

只需使用數字進行遍歷,您需要將其寫下來以准確查看其行為(將來,我建議在代碼中添加大量打印內容,以檢查變量以及變量在每次傳遞過程中的變化)。

prod(1,4)
m=1,n=4
m != n so, recurse = prod(1, 3)

prod(1, 3)
m=1,n=3
m != n so, recurse = prod(1, 2)

prod(1, 2)
m=1,n=2
m != n so, recurse = prod(1, 1)

prod(1, 1)
m=1,n=1
m == n so,
return 1

returns to prod(1, 2)
recurse = 1
result = 2 * 1
return 2

returns to prod(1, 3)
recurse = 2
result = 3 * 2
return 6

returns to prod(1, 4)
recurse = 6
result = 4 * 6
return 24

因此,您的程序打印24。

有時,找出程序的最佳方法是機械地逐行執行各個步驟,然后在腦海中(或在紙上追蹤它們)執行它們。

要了解任何帶有函數的程序,您假定被調用函數正確執行了它們的工作,並檢查調用函數是否以正確的順序用正確的參數調用了它們,並正確組合了結果。

對於遞歸函數,您需要檢查每個遞歸調用是否使您更接近沒有遞歸的情況。

在這里,沒有人告訴我們結果應該是什么。 每當m == n ,遞歸結束,並且遞歸調用的n = n - 1 ,因此,只有當m <= n ,遞歸調用才有效。

考慮一串電話,每個電話將n減少1,而m保持固定。 n == m + 3為找出發生的情況:第一個呼叫得到m + 2 ,第二m + 1 ,第三m ,並返回m 第二個取n == m + 1乘以第三個返回的m ,第二個取n == m + 2並乘以先前的結果,最后結果為(m + 3) * (m + 2) * (m + 1) * m 此函數計算n! / (m - 1)! n! / (m - 1)! 如果n >= m 知道這是怎么回事,很容易檢查我們(到目前為止)的預感是否正確。

prod(1, 4);

public static int prod(int m, int n) {
    if (m == n) {
        return n;
    } else {
        int recurse = prod(m, n-1);
        int result = n * recurse;
        return result;
    }
}

可以將m == 1轉換為:

prodA(4);
public static int prodA(int n) {
    if (1 == n) {
        return n;
    } else {
        int recurse = prodA(n-1);
        int result = n * recurse;
        return result;
    }
}

具有轉換(頭部遞歸):

public static int prodA(int n) {
    int result = 1;
    while (n > 1) { // Actually n != 1
        result *= n;
        --n;
    }
    return result;
}

這是階乘函數。

暫無
暫無

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

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