输入一个数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)。涉及到递归栈的调用,如果递归结束条件不恰当,会造成栈溢出。
从代码的角度分析:(递与归的过程)
循环的调用自己,直到遇到确切的返回值,并且将最终的结果返回。
两种方法的都是可以的,但是更推荐使用循环求解,递归会有栈的内存的分配,会是一种资源的消耗。