初级阶段算法之递归算法

一:递归的概念

在一个函数中再次调用该函数自身的行为叫做递归,这样的函数被称作递归函数。需要注意的是,递归函数中的参数或者函数中的某一变量的值肯定会改变,若不改变,则函数在自己调用自己的过程中,没有标志函数停止的标志,函数会陷入死循环。

  如:void digui1(){  printf("a\n");  }

       void digui2(){ digui1(); };

在主函数中调用函数digui2()时,函数会陷入死循环。

二、递归的具体执行顺序

  请看博客   http://www.cnblogs.com/DanielZheng/archive/2011/08/22/2149379.html

之前将递归理解为从后往前推,其实是存在问题的。请参考上述网址的介绍。

三、递归题解

  1.输入一个正整数n,输出1+2+3+。。。+n的结果。

    

答案:

int digui(int n)                         现在以具体的行为来理解这段函数。已知有编号为1,2,3,4,..., n个房间,每个房间里面都放了苹果,调用digui(n)函数就表示求解编号为n的

{                                            房间的的苹果数。现在告诉你    每间房里的苹果=这间房的编号+前一间房子里面的苹果数(用篮子盖住) 。现在要求第5间房子有多少苹果。

  if(n==1)  return 1;             digui(5)=digui(4)+5;   //第5间房子的苹果=第4间房子里的苹果+房间编号5(我不知道第4间房有多少苹果,那就去找喽)

  return digui(n-1)+n;           digui(4)=digui(3)+4;     //第4间房子的苹果=第3间房子的苹果+房间编号4(我不知道第3间房有多少苹果,那就去找喽)

}                                            digui(3)=digui(2)+3;   //第4间房子的苹果=第3间房子的苹果+房间编号3(我不知道第2间房有多少苹果,只能继续找)

                 digui(2)=digui(1)+2;    //第4间房子的苹果=第3间房子的苹果+房间编号2(我不知道第1间房有多少苹果,要去第1间房找)

digui(1);                     //if(n==1)  return 1;   也就是说当你到达第1间房,digui(1)   return 1 告诉你第一间房只有一个苹果。

知道第1间房子里的苹果,由此我们可以逆推出2号房间的苹果,然后一直推出第5间房子的苹果。

同理可推出第n间房子的结果,在主函数中调用digui(n)时即可return digui(n-1)+n返回结果给主函数。

digui(n) 直接返回digui(n-1)+n的值。上述大段文字的步骤在程序内部已快速执行完毕。

时间: 2024-12-19 11:25:54

初级阶段算法之递归算法的相关文章

数据结构与算法之递归算法 C++和PHP实现

递归算法:就是一种直接或间接调用自身的算法. 实现过程:通过函数或者子过程来完成,在函数或者子过程中编写代码直接或间接的调用自己,即可完成递归操作.(相同类别的问题,把问题层层转换为规模缩小的子问题到最小问题有已知条件,然后来求解,然后得到结果逐级返回.其实也是一种循环.) 最主要体现:小的代码量解决了非常复杂的问题 特点: 1.递归就是方法里调用自身 2.必须有一个明确的递归结束条件,称为递归出口. 3.简洁但是运行效率较低,一般不提倡使用 4.每一层的返回点.局部变量等开辟了栈来存储,递归次

算法问题——递归算法

今天在做项目用到一个递归,竟然做了许久没有找到算法的错误之处,记录下.有空在思考下-- 下面是错误代码: 功能是如果字符串以RTS_Mon->结尾,就截去最后面的 RTS_Mon-> 处理结果应该为:1 RTS_Mon-> 2 RTS_Mon-> 3 RTS_Mon-> 4 RTS_Mon-> 5 RTS_Mon-> 6 RTS_Mon-> 7 RTS_Mon->" + "\r\n"+"RTS_Mon-(Admi

贪心算法,递归算法,动态规划算法比较与总结

一般实际生活中我们遇到的算法分为四类: 一>判定性问题        二>最优化问题        三>构造性问题        四>计算性问题 而今天所要总结的算法就是着重解决  最优化问题 <算法之道>对三种算法进行了归纳总结,如下表所示:   标准分治 动态规划 贪心算法 适用类型 通用问题 优化问题 优化问题 子问题结构 每个子问题不同 很多子问题重复(不独立) 只有一个子问题 最优子结构 不需要 必须满足 必须满足 子问题数 全部子问题都要解决 全部子问题都要

实验一 算法问题求解基础--欧几里得递归算法和递归算法

1.欧几里得递归算法 2.欧几里得迭代算法 3.连续整数检测算法 4.递归算法 实验一算法问题求解基础 实验名称:算法问题求解基础 实验章节:算法设计与分析第一章内容 实验内容 第一部分 欧几里得算法求最大公约数 问题: 1. 计算:34931与 75236 的最大公约数: 1 #include<iostream.h> 2 3 //1.欧几里得递归算法 4 void Swap(int&a,int&b) 5 { 6 int c=a;a=b;b=c; 7 } 8 9 int RGc

递归算法 c#

1.  算法思路 递归算法,就是一种直接或者间接调用自身算法.递归算法的具体实现过程一般通过函数或者子过程来完成,在函数或者子过程的内部,编写代码直接或者间接地调用自己即可完成递归操作. //阶乘 private static int Fact(int i) { if (i<=1) { return i; } else { return i * Fact(i - 1); } }

算法的复杂度包括时间复杂度和空间复杂度分别如何计算?

一 .时间复杂度 一.概念 时间复杂度是总运算次数表达式中受n的变化影响最大的那一项(不含系数) 比如:一般总运算次数表达式类似于这样: a*2n+b*n3+c*n2+d*n*lg(n)+e*n+f a ! =0时,时间复杂度就是O(2n); a=0,b<>0 =>O(n3); a,b=0,c<>0 =>O(n2)依此类推 例子: (1) for(i=1;i<=n;i++) //循环了n*n次,当然是O(n2) for(j=1;j<=n;j++) s++;

[算法技术]算法的时间复杂度与空间复杂度

1.时间复杂度 算法的时间复杂度是衡量一个算法效率的基本方法.在阅读其他算法教程书的时候,对于算法的时间复杂度的讲解不免有些生涩,难以理解.进而无法在实际应用中很好的对算法进行衡量.            <大话数据结构>一书在一开始也针对算法的时间复杂度进行了说明.这里的讲解就非常明确,言简意赅,很容易理解.下面通过<大话数据结构>阅读笔记的方式,通过原因该书的一些简单的例子和说明来解释一下算法的时间复杂度和它的计算方法.          首先从基本定义下手,来了解一下什么是“

算法导论-动态规划-钢条切割

动态规划通常用于解决最优化问题,在这类问题中,通过做出一组选择来达到最优解.在做出每个选择的同时,通常会生成与原问题形式相同的子问题.当多于一个选择子集都生成相同的子问题时,动态规划技术通常就会很有效,其关键技术就是对每个这样的子问题都保存其解,当其重复出现时即可避免重复求解. 钢条切割问题 Serling公司购买长钢条,将其切割为短钢条出售.切割工序本身没有成本支出.公司管理层希望知道最佳的切割方案.假定我们知道Serling公司出售一段长为i英寸的钢条的价格为pi(i=1,2,…,单位为美元

重拾算法之路——递归与分治基础

***************************************转载请注明出处:http://blog.csdn.net/lttree******************************************** 这个周末家里有点事,回了趟家,就断了一些学习计划.. 抓紧补上! 第一个算法--递归与分治 都知道,分治算法基本思想是 将一个难以直接解决的问题,分割成一些规模小的相同问题,以便各个击破,分而治之, 这样,我们就可以将一个复杂的算法,类型不变,规模越来越小,最终