`
javasee
  • 浏览: 961074 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

反应迟钝的递归

 
阅读更多

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

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

 

这个算法该怎么写呢?!

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

0
0
分享到:
评论

相关推荐

    C#递归 C#递归 C#递归

    根据给定的信息,本文将详细解释C#中的递归概念,并通过具体的代码示例来解析递归函数在构建树形结构中的应用。 ### C#递归基础 #### 什么是递归? 递归是一种编程技术,它允许一个方法或函数直接或间接地调用自身...

    .net 递归算法 .net 递归算法.net 递归算法

    在.NET编程环境中,递归算法是一种强大的工具,它允许函数或方法调用自身来解决复杂问题。递归的核心思想是将大问题分解为相同或相似的小问题,直到问题变得足够简单,可以直接得出答案。这种解决问题的方式在数据...

    ackermann函数的递归实现和非递归实现

    阿克曼函数是一种非常特殊的数学函数,常用于理论计算和计算机科学中,特别是在讨论递归算法和计算复杂性时。这个函数是由荷兰数学家格奥尔格·阿克曼在20世纪早期提出的,它展示了超越函数的概念,即无法用初等函数...

    可并行递归算法的递归多线程实现

    ### 可并行递归算法的递归多线程实现:深入解析 #### 引言:多线程与并行处理的重要性 随着计算任务日益复杂,传统的单线程编程模型已无法满足高效处理大规模数据的需求。多线程编程作为一种提高程序并发性和性能...

    递归算法与非递归转化

    递归算法与非递归转化 递归算法是把问题转化为规模缩小了的同类问题的子问题,然后递归调用函数(或过程)来表示问题的解。递归的效率一般不高,但是递归比较符合人类的思维方式。一般而言非递归算法更有效;但很多...

    abap简单递归算法

    ### ABAP简单递归算法解析 #### 一、引言 ABAP(Advanced Business Application Programming)是一种用于SAP系统的编程语言。它不仅支持传统的过程化编程,还支持面向对象编程和Web开发。本文将深入探讨一个ABAP中...

    acm递归算法总结竞赛

    在ACM(国际大学生程序设计竞赛)中,递归算法是一种常见的解决问题的方法,它通过函数自身调用自身来实现问题的解决。递归的核心在于找到基本情况(base case),即可以直接求解的问题,以及每次递归调用时问题规模...

    快速选择非递归与递归算法实现

    空间复杂度方面,非递归实现主要取决于分区操作和栈的使用,而递归实现则依赖于递归深度,一般情况下都是O(log n)。 在实际编程中,可以根据具体需求选择非递归或递归实现。非递归版本更适合内存有限或者递归深度...

    数据结构二叉树遍历递归,非递归

    在本主题中,我们将深入探讨二叉树的三种主要遍历方法:中序遍历、前序遍历和后序遍历,以及如何通过递归和非递归的方式实现这些遍历。 首先,让我们理解递归遍历的概念。递归是一种解决问题的方法,它将问题分解为...

    5.6 递归思想和递归函数1

    在编程领域,递归是一种强大的思想,它基于解决问题的子问题与原问题具有相同结构的特点。递归函数是实现递归思想的一种方式,通常在函数内部调用自身来解决复杂问题。本节将深入探讨递归思想和递归函数的概念,并...

    CRP.zip_CRP_CRP递归图_matlab 递归图_递归 MATLAB_递归分析

    在IT领域,递归是一种强大的编程技术,常用于解决复杂问题。递归图和递归分析是理解递归过程和优化算法效率的重要工具。本文将深入探讨这些概念,并结合MATLAB环境,阐述如何利用它们进行复杂的系统分析。 首先,...

    阿克曼函数 c程序 递归与非递归算法的综合

    阿克曼函数是一种非常特殊的数学函数,它在计算理论和计算机科学中被广泛用来探讨递归的概念。这个函数因其复杂的性质而闻名,特别是在其参数达到一定值时,增长速度极其迅速,以至于很快超出任何可计算的范围。在这...

    递归算法到非递归算法的转换.ppt

    递归算法是编程中一种强大的工具,它通过调用自身来解决问题或简化复杂的问题。然而,在某些场景下,非递归算法可能更有利于性能优化或理解。本章将探讨如何将递归算法转换为非递归算法。 首先,我们要了解递归的...

    递归图 时间序列重构小波变换_递归图matlab_reconstitution_recurrenceplots_小波变换_递归图

    在时间序列分析领域,递归图(Recurrence Plots,简称RP)是一种强大的可视化工具,用于揭示时间序列的内在结构和动态行为。递归图通过将时间序列转换为二维图形,帮助研究人员直观地理解系统的复杂性和周期性。本文...

    消除文法左递归

    在编译原理中,消除文法的左递归是一个重要的概念,主要应用于解析器的构造。这个过程是为了使解析过程更加高效,避免无限循环的发生。本文将深入探讨左递归的定义、为何需要消除以及如何消除,同时结合课程设计与...

    二叉树递归与非递归遍历

    递归遍历的优点在于其代码简洁明了,但缺点是当处理大规模的二叉树时,递归可能会导致栈溢出,因为每次递归调用都会增加栈的深度。 **非递归遍历** 1. **前序遍历**: - 使用一个栈来保存待访问的节点。 - 将根...

    熵的递归图分析_熵_熵递归_递归图分析_一维信号特征_递归图_

    本主题聚焦于熵的递归图分析,这是一种利用递归图来提取一维信号特征的方法,广泛应用于信号的分类、识别和特征提取。 首先,我们要理解“熵”的基本概念。熵在信息论中定义为一个随机变量的不确定性,通常用数学...

    读懂C++递归程序

    C++递归程序的概念及其执行过程 递归是计算机科学中的一个核心概念,它是一种解决复杂问题的方法,通过将大问题分解为规模更小、更容易解决的小问题来实现。在程序设计中,递归允许程序调用自身来处理这些分解后的...

    5!递归算法和非递归算法

    递归算法和非递归算法 在计算机科学与编程领域中,递归算法与非递归算法是两种非常重要的计算方法。本文将详细介绍这两种算法的特点、应用场景以及如何实现它们,特别针对初学者及面试准备者。 #### 递归算法 ...

Global site tag (gtag.js) - Google Analytics