递归算法的一些简单的实例
确实花钱订阅了一下数据结构与算法的专栏,这里没有把专栏里面的内容写到博客上,我很注重人家的劳动成果的,所以我只把我写的,或者是网上找的一些算法的实例在这里贴出来,方便自己以后的学习,以及对自己的对一些比较常见的算法的理解有所帮助!
在公司的时候,空闲的时间写的递归算法的一些实例,我也测试过了,可以运行的!
- 1 /***
- 2 * 递归求和 1+2+3+...+n
- 3 * @param n 输入的数值
- 4 * @return
- 5 */
- 6 public static int recursionSum(int n){
- 7
- 8 if(n>0){
- 9 return n + recursionSum(n);
- 10 }else{
- 11 return 0;
- 12 }
- 13 }
- 14
- 15 /***
- 16 * 递归阶乘 n! = n*(n-1)*(n-2)*...*1
- 17 * @param n 需要求取阶乘的数值
- 18 * @return
- 19 */
- 20 public static int recursionMulity(int n){
- 21
- 22 if(n == 1){
- 23 return 1;
- 24 }
- 25 return n * recursionMulity(n-1);
- 26 }
- 27
- 28 /***
- 29 * 题意:一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。
- 30 * 这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?
- 31 *
- 32 * 分析:第七天后该人只有2只鸭子,记每天的鸭子数量为num,则之前每天的鸭子总数为当天后一天的(num+1)*2只,当天卖掉的鸭子个数为(num/2)+1只
- 33 *
- 34 * 算法步骤:
- 35 * 1) 令num等于2,n等于7;
- 36 * 2) 计算前一天的总鸭子数量num = (num + 1) * 2;
- 37 * 3) 计算并输出第n天卖掉的鸭子数量;
- 38 * 4) 将n减去1,判断n是否大于0,若是,则输出总鸭子数量num,否则,递归调用函数继续进行计算。
- 39 *
- 40 * @param num 最后一天剩余的鸭子的数量
- 41 * @param counter 村庄的个数
- 42 * @return 计算出的sum的和
- 43 */
- 44 public static int duck_sale(int num, int counter){
- 45
- 46 num = (num + 1) * 2;
- 47 System.out.println("第"+counter+"个村子卖出的鸭子的数量是:>>>>>>"+(num/2-1));
- 48 //计数器减1
- 49 counter--;
- 50
- 51 if(counter > 0){
- 52 //说明前面鸭子没卖完 递归调用方法 算出该村子卖出的鸭子的数量
- 53 duck_sale(num,counter);
- 54 }else{
- 55 //说明鸭子卖完了
- 56 System.out.println("鸭子的总数是:>>>>>>"+num);
- 57 }
- 58 return num;
- 59 }
- 60 /***
- 61 * 角谷定理。输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。经过如此有限次运算后,总可以得到自然数值1。
- 62 * 求经过多少次可得到自然数1。
- 63 * 如:输入22,
- 64 * 输出 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
- 65 * STEP=16
- 66 *
- 67 * 算法步骤:
- 68 * 1)定义计数器counter=0 输入自然数的值
- 69 * 2)判断n 是否为偶数,若是,则n=n/2 若不是,则n=n*3+1
- 70 * 3)判断n是否等于1 若是,则输出counter,若不是继续 调用jiaogu()
- 71 *
- 72 * @param n 输入的自然数 所要求的数值
- 73 * @return 输出最后结果所需要的调用几次
- 74 */
- 75 public static int jiaogu(int n, int counter){
- 76
- 77 //这个计数器不可以在这里赋值的,这样每一次调用方法进来之后,都会重置counter的值
- 78 //int counter = 1;
- 79
- 80 if(n == 1){
- 81 System.out.println("Step is >>>>>>"+counter);
- 82 }else{
- 83 //计数器+1
- 84 counter++;
- 85 if(n % 2 == 0){
- 86 n = n / 2;
- 87 }else{
- 88 n = n * 3 + 1;
- 89 }
- 90
- 91 System.out.println("输出当前自然数的值是:>>>>>>"+n);
- 92 //递归调用
- 93 jiaogu(n,counter);
- 94 }
- 95 return counter;
- 96 }
版权声明:本文为ssh-html原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。