所有的遞歸演算法空間複雜度都是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)
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 | 編程 | 計算機科學 | 遞歸 |