2015-07-12 143 views
-2

我是新來的。 我在Java中遇到了一個遞歸函數的問題。遞歸函數幫助 - Java

public static void main(String[] args) { 
    System.out.println(f(3)); 
} 

private static int f(int n) { 
    if (n<=0) return 1; 
    return 2*f(n-1)+3; 
} 

如果我設置n = 3,結果是29。 請幫助,我不明白結果,這將是非常好的, 如果有人能夠準確解釋這個函數發生了什麼。

+1

瞭解如何使用調試器。它在許多情況下會很有用。 – Glorfindel

+2

你是否理解n = 1和n = 2的結果? – Bathsheba

+0

Netbeans中的調試器在這種情況下沒有幫助 – Muratovic

回答

1

學習跟蹤遞歸函數的執行可以幫助您在將來創建一個函數。這是一項重要的技能發展。

讓我們來做一個跟蹤。

每個遞歸函數都有一個「退出條件」或「基本情況」。在你的功能中,當n < = 0時。您在3過去了,所以其結果必然是:

2 * F(2)+ 3

什麼是F(2)? 2 * f(1)+ 3

什麼是f(1)? 2 * F(0)+3

我們知道,F(0)= 1,因爲這是你的基本情況,所以現在向後工作,並在表格填寫:

f(0): 1 
f(1): 2*1 + 3 = 5 
f(2): 2*5 + 3 = 13 
f(3): 2*13 + 3 = 29 
+0

很好的解釋 – maskacovnik

+0

令人驚歎的解釋,非常感謝:) Netbeans中的調試器沒有幫助我反正,它沒有告訴我結果一步步 :( – Muratovic

2

看那方法

private static int f(int n) { 
    if (n<=0) return 1; 
    return 2*f(n-1)+3; 
} 

起初,f(3)將被稱爲

方法返回2*f(2)+3

計算f(2)方法需要返回2*f(1)+3

f(1)將被計算2*f(0)+3

f(0)1的條件n<=0,所以讓我們回到軌道

2*1+3 = 5 = f(1) 
2*5+3 = 13 = f(2) 
2*13+3 = 29 = f(3) 
+0

您的解釋與我的解釋幾乎相同,但更簡潔。 – Schien

+0

也許我的觀點是數學,而不是編程:D @Schien – maskacovnik

1

F(0)爲1

你加倍前一個並添加3

得到下一個數

所以順序是1,5,13,​​29,61等

通過遞歸解決這個問題並不是最好的方法(你的棧會溢出q uite小項);正常循環會更好。

+1

seqeunce上市+1 – maskacovnik