2013-05-31 132 views
-6

即時學習從我的期末考試從教科書。我無法解決這個問題,所以我需要回答這個問題。遞歸定義解決方案

1)寫一個函數multiply(int a,int b)的遞歸定義,該函數採用兩個整數並返回乘法結果。

我回答:

Multiply(a, b) : 
0 - if a or b is equal to zero. (I got -1 here. Reason written: only 1) 
a * b - (I didn't know what to write here) 

2) 編寫採用整數鏈表,然後返回它的總和的元素遞歸方法。

我的解決辦法是:

int sumList(Node<Integer> list) { 

    int temp = list.getInfo(); 

    if(temp == null) { 
     return 0; 

    } else { 
     return temp + sumList(temp.getNext); 
    } 
} 

我固定它,我想:

public int sumList(Node<Integer> list) { 

    Node<Integer> temp = list; 

    if(temp == null) { 
     return 0; 

    } else { 
     return temp.getInfo() + sumList(temp.getNext()); 
    } 
} 

是對問題2右側的解決方案?

+5

沒有,這是不對的。它甚至沒有編譯。爲什麼不編譯和運行你的代碼,並看看它是否產生正確的結果? –

+0

@ user2272227谷歌它充足的遞歸方法樣本在那裏! – MaheshVarma

+0

@JBNizet這就是原因,bcz爲我的考試我無法測試,這是一個筆試。我需要幫助找到正確的代碼,並查看它爲什麼是錯誤的。 – user2272227

回答

0

要得到一個可用的遞歸解決方案,您需要一個基例,例如a == 0,然後通過遞歸調用自己來處理基本情況。

問題1的解決辦法是沿此線的東西,這降低了a參數,直到它到達0

int multiply(int a, int b) { 
    if (a == 0 || b == 0) { 
     return 0; 
    } 
    return b + multiply(a - 1, b); 
} 

例如,multiply(2, 5)將成爲5 + multiply(1, 5) - >5 + 5 + multiply(0, 5) - >5 + 5 + 0

請注意,此特定解決方案不適用於負數,但您明白了。你應該可以輕鬆地爲自己添加支持。

+3

其實你不需要第二個'if'。 –

+0

你能幫忙解釋一下最後一部分嗎,我理解了前2部分,但是部分是返回b +乘。不太理解它。 – user2272227

+0

@ Anony-Mousse:對。我陷入了乘法思維。 – Keppil

0

A)好的,你真的需要重新閱讀遞歸章節。

的數學原理是這樣的:

http://en.wikipedia.org/wiki/Mathematical_induction

和維基百科的文章將引導您完成一個更復雜的任務。 B)不,它不會編譯。有多個語法錯誤。

嘗試使用Java編譯器來提高編程技能。

3

既然這是考試準備,我不想給你這樣做的代碼。相反,我會給你一些想法。

對於問題否1.因爲乘法是重複求和,所以可以在這裏用它作爲遞歸的基礎。

如果你想找到3 * 4,使用遞歸計算並傳回4 + 4 + 4

換句話說,你可以看到下面的模式出現。

4 * 3 = 4 +(4 * 2)

4 * 3 = 4 + 4 +(4 * 1)

+1

+1幫助無代碼。 4 * 3 = 4 + 4 * 2 = 4 + 4 + 4 * 1。 – TecHunter

+0

@TecHunter和銀,確定基本上id是做這樣的事情︰return b + multiply(a - 1,b);因爲有人貼出來,但我不明白爲什麼需要a-1? – user2272227

+1

OH! a-1將它放到0,直到每次我們需要將其倍增爲止。例如,5 * 5,它會繼續加5,直到a爲0,那麼它會停止意味着它根據需要添加5,5,5,5,5 5次!正確? – user2272227