反应迟钝的递归

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

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的值

 

这个算法该怎么写呢?!

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值