经常会看到一些人,问你,“来,写一个递归算法吧”。递归算法真的那么好吗?下面是经常看到的一些题目,还有,递归算法的优缺点!
常见题:
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#中的递归概念,并通过具体的代码示例来解析递归函数在构建树形结构中的应用。 ### C#递归基础 #### 什么是递归? 递归是一种编程技术,它允许一个方法或函数直接或间接地调用自身...
在.NET编程环境中,递归算法是一种强大的工具,它允许函数或方法调用自身来解决复杂问题。递归的核心思想是将大问题分解为相同或相似的小问题,直到问题变得足够简单,可以直接得出答案。这种解决问题的方式在数据...
阿克曼函数是一种非常特殊的数学函数,常用于理论计算和计算机科学中,特别是在讨论递归算法和计算复杂性时。这个函数是由荷兰数学家格奥尔格·阿克曼在20世纪早期提出的,它展示了超越函数的概念,即无法用初等函数...
### 可并行递归算法的递归多线程实现:深入解析 #### 引言:多线程与并行处理的重要性 随着计算任务日益复杂,传统的单线程编程模型已无法满足高效处理大规模数据的需求。多线程编程作为一种提高程序并发性和性能...
递归算法与非递归转化 递归算法是把问题转化为规模缩小了的同类问题的子问题,然后递归调用函数(或过程)来表示问题的解。递归的效率一般不高,但是递归比较符合人类的思维方式。一般而言非递归算法更有效;但很多...
### ABAP简单递归算法解析 #### 一、引言 ABAP(Advanced Business Application Programming)是一种用于SAP系统的编程语言。它不仅支持传统的过程化编程,还支持面向对象编程和Web开发。本文将深入探讨一个ABAP中...
在ACM(国际大学生程序设计竞赛)中,递归算法是一种常见的解决问题的方法,它通过函数自身调用自身来实现问题的解决。递归的核心在于找到基本情况(base case),即可以直接求解的问题,以及每次递归调用时问题规模...
空间复杂度方面,非递归实现主要取决于分区操作和栈的使用,而递归实现则依赖于递归深度,一般情况下都是O(log n)。 在实际编程中,可以根据具体需求选择非递归或递归实现。非递归版本更适合内存有限或者递归深度...
在本主题中,我们将深入探讨二叉树的三种主要遍历方法:中序遍历、前序遍历和后序遍历,以及如何通过递归和非递归的方式实现这些遍历。 首先,让我们理解递归遍历的概念。递归是一种解决问题的方法,它将问题分解为...
在编程领域,递归是一种强大的思想,它基于解决问题的子问题与原问题具有相同结构的特点。递归函数是实现递归思想的一种方式,通常在函数内部调用自身来解决复杂问题。本节将深入探讨递归思想和递归函数的概念,并...
在IT领域,递归是一种强大的编程技术,常用于解决复杂问题。递归图和递归分析是理解递归过程和优化算法效率的重要工具。本文将深入探讨这些概念,并结合MATLAB环境,阐述如何利用它们进行复杂的系统分析。 首先,...
阿克曼函数是一种非常特殊的数学函数,它在计算理论和计算机科学中被广泛用来探讨递归的概念。这个函数因其复杂的性质而闻名,特别是在其参数达到一定值时,增长速度极其迅速,以至于很快超出任何可计算的范围。在这...
递归算法是编程中一种强大的工具,它通过调用自身来解决问题或简化复杂的问题。然而,在某些场景下,非递归算法可能更有利于性能优化或理解。本章将探讨如何将递归算法转换为非递归算法。 首先,我们要了解递归的...
在时间序列分析领域,递归图(Recurrence Plots,简称RP)是一种强大的可视化工具,用于揭示时间序列的内在结构和动态行为。递归图通过将时间序列转换为二维图形,帮助研究人员直观地理解系统的复杂性和周期性。本文...
在编译原理中,消除文法的左递归是一个重要的概念,主要应用于解析器的构造。这个过程是为了使解析过程更加高效,避免无限循环的发生。本文将深入探讨左递归的定义、为何需要消除以及如何消除,同时结合课程设计与...
递归遍历的优点在于其代码简洁明了,但缺点是当处理大规模的二叉树时,递归可能会导致栈溢出,因为每次递归调用都会增加栈的深度。 **非递归遍历** 1. **前序遍历**: - 使用一个栈来保存待访问的节点。 - 将根...
本主题聚焦于熵的递归图分析,这是一种利用递归图来提取一维信号特征的方法,广泛应用于信号的分类、识别和特征提取。 首先,我们要理解“熵”的基本概念。熵在信息论中定义为一个随机变量的不确定性,通常用数学...
C++递归程序的概念及其执行过程 递归是计算机科学中的一个核心概念,它是一种解决复杂问题的方法,通过将大问题分解为规模更小、更容易解决的小问题来实现。在程序设计中,递归允许程序调用自身来处理这些分解后的...
递归算法和非递归算法 在计算机科学与编程领域中,递归算法与非递归算法是两种非常重要的计算方法。本文将详细介绍这两种算法的特点、应用场景以及如何实现它们,特别针对初学者及面试准备者。 #### 递归算法 ...