zoukankan      html  css  js  c++  java
  • 关于递归的一些思考

    关于递归:

    递归的实现,使代码更加整洁清晰,但是当数据较大的时候,并不能体现出它的优点。

    代码:

    /**
     * @fuction  
     * @author mly11
     * @date 2017年3月16日
     * @time 下午7:46:39
     */
    public class Recursion {
        public static void main(String[] args) {
            int x = 30;
            System.out.println(rec(x));
    
            System.out.println("----------------------------------");
            double y = Math.pow(1.618033988745, x);
            System.out.println(0.4472135955*y);
    
            System.out.println("------------------------------------");
    //        斐波那契数列通式:  记: m^2=5  
    //        则通式为:F(n) = ( 1/m) * ( ( (1+m)/2 )^n - ( (1-m)/2 )^n );
            double m = Math.sqrt(5);
            double z = (1/m)*(Math.pow(((1+m)/2), x) - Math.pow(((1-m)/2), x));
            System.out.println(z);
            
    //        当n=30的时候,结果为:
    //            832040
    //            ----------------------------------
    //            832039.9999248054
    //            ------------------------------------
    //            832040.0000000008
        }
    //    使用递归计算
        public static int rec(int x){
            if(x == 1){
                x = 1;
            }else if(x == 2){
                x = 1;
            }else{
                x = rec(x-1) + rec(x-2);
            }
            return x;
        }
    }

    以上代码中,当x为50的时候,我的电脑就需要处理很长时间(从来都是没出来结果,就手动停掉了,哈哈),而剩下的两种方式计算(使用到了高数里的一些特征根和特征方程的知识),数字很大的时候,也可以在1秒之内得到。所以:使用递归的时候,应充分考虑到自己的程序所需要处理的数的大小,也就是递归的深度。

    当然,某些时候,正确的使用递归也是可以得到惊喜的。

  • 相关阅读:
    最简单跨平台的日志库
    linux文件锁
    Linux 获取屏幕分辨率与窗口行列数(c/c++)
    linux 信号机制
    记一次函数异常(getopt_long)
    程序单实例运行
    简单地 Makefile 书写
    学习go的一些笔记
    20200930 10. Netty 核心源码剖析
    20200930 9. TCP 粘包和拆包 及解决方案
  • 原文地址:https://www.cnblogs.com/moly/p/6830297.html
Copyright © 2011-2022 走看看