2015-02-11 97 views
0
public int foo (int x , int k) { 
    if (x <= k) 
     return 1; 
    else 
     return foo (x/k , k) + 1; 
} 

從我的理解,這應該等於條件的運行時間+較大的if/else語句的運行時間。大哦表示法下面語句的運行時間是多少?

但是,我無法確定語句「return foo(x/k,k)+ 1」的正確運行時間。這會保持不變嗎? x和k的增加似乎對運行時間沒有影響,因爲它們之間的比率對結果很重要。

任何清晰度將不勝感激。謝謝!

+0

從邏輯上推導出結果似乎相當棘手,但您可以通過測量各種輸入的運行時間並尋找趨勢來找到答案。幸運的是,你甚至不需要時間測量功能來做到這一點,因爲函數返回的數字與函數體執行的次數相同。防爆。如果函數返回6,則返回時間是其返回值的兩倍3. – Kevin 2015-02-11 14:10:06

回答

2

遞歸調用每次將x除以k,所以k> = 2的複雜度爲O(logk(x))-以k爲底的x的對數。

對於k < 2它可能不會終止(實際上,它將耗盡內存或除以零)。

+0

如果k> = 2 ... – 2015-02-11 14:18:11

+0

爲真,則修正它。 – svinja 2015-02-11 14:25:32

+0

那麼,實際上-2也會終止 – 2015-02-11 14:26:59