2015-06-19 102 views
0
public int count7(int n) 
{ 
    int count = 0; 
    if (n%10 == 7) count= 1; 
    if(n%10 != 7) count= 0; 

    if (n < 10 && n==7) return 1; 
    if (n < 10 && n!=7) return 0; 
    else return count7(n/10) + count; 
} 

我有上述函數遞歸地添加7在給定數字中的出現次數。每次它將數字除以10以減少1個數字並檢查最後一個數字是否等於7.遞歸函數與本地變量不執行,如果語句

當我將它作爲count7(7)運行時,它返回1.我有一個問題,它爲什麼從未命中第一if語句(if n%10 == 7) count = 1;

如果我的計劃是寫爲:

public int count7(int n) 
{ 
    int count = 0; 
    if (n%10 == 7) count= 0; 
    if(n%10 != 7) count= 0; 

    if (n < 10 && n==7) return 1; 
    if (n < 10 && n!=7) return 0; 
    else return count7(n/10) + count; 
} 

呼叫count7(7)仍能正常工作。我的問題是,當遞歸調用放在堆棧上時,爲什麼最後一次調用沒有將count賦值爲1,而是將其賦值爲0?

例如:

Count7(717)

Count7(7) + count <-------This hits the base case since n < 10 
Count(71) + count 
Count(717) + count 

計數被分配1每當ñ%10 == 7.但鹼情況下,也將返回1,因爲它是請解釋此一例只有我無法正確理解的事情。

+1

另外「if(n <10 && n == 7)」是多餘的。 – DJClayworth

+0

逐行掃描代碼。在你走的時候,把每個變量的值寫在一張紙上(記住跟蹤所有不同的'count'實例)。 – DJClayworth

+0

你的第二個代碼是否適用於count(717)? – lmcphers

回答

2

你在打三個return語句

if (n < 10 && n==7) return 1; 
if (n < 10 && n!=7) return 0; 
else return count7(n/10) + count; 

只有第三個(遞歸情況下)使用count可變的。當你做count7(7)時,立即觸發基本情況,返回1而不關心什麼count等於,因爲使用了第一個return語句而不是第三個,我想象的是你期望的。

+0

明白了。第一個陳述是返回1而沒有進行任何計算,因爲它從來沒有達到這一點。 – Help123

2

我的問題是,當遞歸調用放在堆棧上時,爲什麼上次調用沒有將count分配爲1,而是將其賦值爲0?

count是一個局部變量,併爲堆棧中的每個調用設置爲不同的值。當n=7if (n < 10 && n==7) return 1;被執行,因此返回1

這就是爲什麼它並不重要的count值是在基本情況下,由於count值不回考慮。

如果你放鬆遞歸變得

count7(717) = count(71) +1 
       (count(7) + 0) + 1 
       1 + 0 + 1 
      -------------- 
        2 
+0

順便提一下,如果在基本情況返回中使用count的值,代碼可以被簡化。 –

+0

非常感謝您的詳細解釋。通過在一張紙上的代碼,我把它畫出來,併發布了你發佈的同樣的東西。這非常有幫助! – Help123

0

跟蹤代碼的執行。當您致電count7(7)它確實觸發了您指出的if語句並設置了count = 1,但之後未使用count的值。執行的下一條語句是if (n < 10 && n == 7) return 1,它將退出return語句中的方法。計數的值不被使用,因此您所做的更改對方法的執行沒有影響。