zoukankan      html  css  js  c++  java
  • 【算法】——反应迟钝的递归

    博文已转移,请借一步说话→ http://www.weixuehao.com/archives/628

    经常会看到一些人,问你,“来,写一个递归算法吧”。递归算法真的那么好吗?下面是经常看到的一些题目,还有,递归算法的优缺点!
    常见题:

    1、计算数组{1,1,2,3,5,8,13...}第30位的值

    Process1
    Static void Main(string[] args)
    {
    Console.WriteLine(Process1(30));
    Console.ReadKey();
    }

    Public Static int Process1(int i)
    {
    if(i==0) return 0;
    if(i==1) return 1;
    else
    return Process1(i-1)+Process1(i-2);
    }

    从此递归我们可以看出,递归就是从后面往前推获得数据,然后进行运算

    但是如果第一题中的30改为40或者更大的数字,你有没有试过呢?

    下面我们用Stopwatch来检测一下运行时间

    递归-时间检测
            static void Main(string[] args)
    {
    Stopwatch watch = new Stopwatch();
    watch.Start();

    Console.WriteLine(Process1(40));
    Console.WriteLine(watch.Elapsed);

    watch.Stop();
    Console.Read();
    }
    public static int Process1(int i)
    {
    if (i == 1) return 1;
    else if (i == 2) return 1;
    else
    {
    return Process1(i - 1) + Process1(i - 2);
    }
    }

    我们运行程序,卡一会,然后输出结果为:

    运行了5秒,这才是当i=40的时候,那如果设置i为50,或更大,那要等的时候就更长了。

    递归优点,简单明了,容易理解;缺点,就是效率低。

    下面我们来优化一下,用如下的代码:

    优化方法-时间监测
            static void Main(string[] args)
    {
    Stopwatch watch = new Stopwatch();
    watch.Start();

    int[] num = new int[40];
    num[0] = 1;
    num[1] = 1;
    int first = num[0];
    int second = num[1];
    for (int i = 2; i < num.Length; i++)
    {
    num[i] = first + second;
    first = second;
    second = num[i];
    }
    Console.WriteLine(num[39]);

    watch.Stop();
    Console.WriteLine(watch.Elapsed);
    Console.ReadKey();
    }

    然后我们来看一些运行结果如何:

    运行的时间,瞬间缩短了。。。。。。。。。

    这种方法,将数据从前往后推,得出最终结果。

    看来我们以后还要慎用递归算法。

    2、计算1+2+3+4+...+100的值

    Process2
    static void Main(string[] args)
    {
    Console.WriteLine(Process2(100));
    Console.ReadKey();
    }

    Public Static int Process2(int i)
    {
    if(i==0) return0;
    else
    return Process2(i-1)+i;
    }

    3、计算1-2+3-4+5-6+7...+49-50的值

    这个算法该怎么写呢?!

    欢迎回复,算法多多益善....

  • 相关阅读:
    C# DES加密解密
    VC SOCKET 压缩通信学习
    ASPX一句话爆破工具
    VC读取文件内容
    VC查找字符串
    (学习记录)代码注入之远程线程篇
    WINSOCK 传送文件
    VC数据类型
    占用字节数求法
    HDU
  • 原文地址:https://www.cnblogs.com/laov/p/2347754.html
Copyright © 2011-2022 走看看