輸入一個數n,計算其階乘的結果:value = 1*2*3*4......*(n-1)*n。
循環求解:(是很好理解的)
private static int facyorialValue(int n) { int value = 1; for (int i = 1; i <= n; i++) { value = value * i; } return value; }
其時間復雜度是O(N),空間復雜度是S(1)。#無論規模n是幾,開辟的空間數是固定的#
遞歸求解:
private static int facyorialValue(int n) { if(n == 1){ return 1; //遞歸終止的條件 }else { return facyorialValue(n-1) * n; } }
遞歸的求解思想就是要求 n 的階乘,只要知道前 (n-1) 項階乘的結果,再與n相乘即可。其時間復雜度是O(N),空間復雜度是S(N)。涉及到遞歸棧的調用,如果遞歸結束條件不恰當,會造成棧溢出。
從代碼的角度分析:(遞與歸的過程)
循環的調用自己,直到遇到確切的返回值,並且將最終的結果返回。
兩種方法的都是可以的,但是更推薦使用循環求解,遞歸會有棧的內存的分配,會是一種資源的消耗。