2014-03-05 104 views
-1

我可以使用遞歸計算階乘或for循環如下?遞歸與循環之間的區別?

遞歸階乘

int recursiveFactorial(int n){ 
    if(n<0) 
     return; 
    if(n==0 || n==1) 
     return 1; 
    else 
     return n*recursiveFactorial(n-1); 
} 

,並使用循環

int forFacotrial(int n){ 
    if(n<0) 
     return; 
    if(n==0 || n==1) 
     return 1; 
    else{ 
     int fact=1; 
     for(int i=2;i<=n;i++) 
     { 
      fact=fact*i; 
     } 
     return fact; 
    } 
} 

是什麼都是在性能方面的區別?它有什麼不同?

+0

是調用。你是對的 。差異是在性能方面...... – user3256147

+0

是的,那很好。在性能方面有差異嗎?據我所知,會有n次調用遞歸函數功能。循環也會上升到n次。所以這兩者的複雜性都是O(n)? – user3044327

+0

http://stackoverflow.com/questions/8695104/speed-performance-for-recursion-and-iteration-why-do-they-both-run-at-the-same – SQLMason

回答

0

你會付出沉重的罰款與遞歸版本,因爲除了開銷電話,你會反覆比較n<0==0==1的價值,這是在循環版本不必要的。

稍微更高效的遞歸版本可能是:

int F(int n) 
return n < 3 ? n : n * F(n-1) 

int G(int n) 
return n < 2 ? 1 : F(n) 
+0

遞歸解決方案也是昂貴的堆棧空間,因爲它爲每個嵌套調用分配空間。這裏它與n成正比。一般來說這是不可接受的。在這種特殊情況下,考慮到n> = 13時階乘溢出整數是無害的。 [順便說一句,列出14個值是最好的解決方案。] –

0

性能明智的循環速度更快,也更安全。當你調用遞歸方法時,它總是作爲一個方法調用來執行。因此它在堆棧上分配內存。如果無限地調用遞歸方法,它可能會導致堆棧溢出異常。當你使用循環時,內存分配發生在堆中,因爲它的性能更好更安全。