所有的遞歸演算法空間複雜度都是O(n)嗎?? ?

比如說這個:

function f(a,b){

if(a===1) return b;

else return f(a-1,b);

}

這個空間複雜度是O(1)還是O(n)


轉自知乎某匿名用戶

一般的遞歸

def recsum(x):
if x == 1:
return x
else:
return x + recsum(x - 1)

輸入5

recsum(5)
5 + recsum(4)
5 + (4 + recsum(3))
5 + (4 + (3 + recsum(2)))
5 + (4 + (3 + (2 + recsum(1))))
5 + (4 + (3 + (2 + 1)))
5 + (4 + (3 + 3))
5 + (4 + 6)
5 + 10
15

尾遞歸

def tailrecsum(x, running_total=0):
if x == 0:
return running_total
else:
return tailrecsum(x - 1, running_total + x)

輸入5

tailrecsum(5, 0)
tailrecsum(4, 5)
tailrecsum(3, 9)
tailrecsum(2, 12)
tailrecsum(1, 14)
tailrecsum(0, 15)

尾遞歸在於不在棧中新創建狀態,而是覆蓋當前狀態。但是不是所有的編譯器都支持這種優化。樓主你的函數是屬於尾遞歸的,但是空間複雜度卻不一定是n(1)


遞歸計算一個數組的和也有可能是O(1)複雜度:

int Sum(int[] numbers, int start, int sum)
{
if(start&>=numbers.Length) return sum;
if (start &< 2) return Sum(numbers, start+1, sum+numbers[start]); for(int i=start;i&


如果遞歸了一次就停的話不應該是O(1) 嘛


二分的遞歸演算法的空間複雜度就是O(logN)

當然,這是在遞歸函數內沒有開闢新數組的前提下的………

所以其實……空間複雜度和你遞不遞歸併沒有什麼太大關係……


1.不考慮尾遞歸,題主那個演算法的空間複雜度是O(n)的

2.一個演算法是遞歸的和它的空間複雜度沒有必然關係


master定理介紹了一般的遞歸複雜度的計算方法,如果更複雜的就畫遞歸樹

題主應該接觸cs不久,舉個不是O(n)的,求最大公約數的歐幾里得演算法

int gcd(int a, int b){

return b==0 ? a : gcd(b, a%b);

}//手機打的

這個的複雜度就是O(log(Max(a, b)))的


推薦閱讀:

用c++怎麼零基礎編寫的圖形界面程序?希望不用MFC和API?

TAG:JavaScript | 編程 | 計算機科學 | 遞歸 |