- 首先使用递归输出经典的阶乘,描述如下:
- 1! =1
- 2! = 2
- 3! = 6
…
接下来使用常规的递归方式实现(Java),则可以得到以下程序:
1 | /** |

此递归的计算原理主要是先申请栈幁1到栈幁n,直到找到递归终止的条件,然后开始汇总结果,最后出栈,返回结果,这种递归算法方式有一个弊端,就是在计算的过程中当n很大的情况下会出现栈溢出的错误(java.lang.StackOverflowError),可以使用尾递归的方式进行优化,比如:
1 | /** |
- 计算a,b(a,b为非负整数)的最大公约数?
此题目可以使用欧几里得算法进行解答,实现代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14/**
* 欧几里得算法计算两个数的最大公约数
* @param p 需要计算的数a
* @param q 需要计算的数b
* @return 返回a,b的最大公约数 a,b 是大于0 的正整数
* 算法描述: 计算两个非负整数的最大公约数: 若q是0,则最大公约数为p。否则,将p除以q得到余数r,p和q的最大公约数则为q和r的最大公约数
*/
public static int greatestCommonDivisors(int p , int q){
if(q==0){
return p;
}
int r = p % q;
return greatestCommonDivisors(q,r);
}
最后我们开始使用递归遍历某个目录下的所有子目录和文件进行加深理解和运用:
1 | public static void printDirectoriesAndFilesByPath(String path) { |