递归算法及经典递归例子代码实现

递归(recursion):程序调用自身的编程技巧。

递归满足2个条件:

1)有反复执行的过程(调用自身)

2)有跳出反复执行过程的条件(递归出口)

递归例子:

(1)阶乘

n! = n * (n-1) * (n-2) * ...* 1(n>0)

//阶乘int recursive(int i){ int sum = 0; if (0 == i) return (1); else sum = i * recursive(i-1); return sum;}(2)河内塔问题

//河内塔void hanoi(int n,int p1,int p2,int p3){ if(1==n) cout

从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。

如1,2,3三个元素的全排列为:

1,2,3

1,3,2

2,1,3

2,3,1

3,1,2

3,2,1

//全排列inline void Swap(int &a,int &b){ int temp=a; a=b; b=temp;}void Perm(int list[],int k,int m){ if (k == m-1) { for(int i=0;i

(4)斐波那契数列

斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……

这个数列从第三项开始,每一项都等于前两项之和。

有趣的兔子问题:

一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔子都不死,那么一年以后可以繁殖多少对兔子?

分析如下:

第一个月小兔子没有繁殖能力,所以还是一对;

两个月后,生下一对小兔子,总数共有两对;

三个月以后,老兔子又生下一对,因为小兔子还没有繁殖能力,总数共是三对;

……

依次类推可以列出下表:

//斐波那契

long Fib(int n)

{

if (n == 0)

return 0;

if (n == 1)

return 1;

if (n > 1)

return Fib(n-1) + Fib(n-2);

}

递归(recursion):程序调用自身的编程技巧。

递归满足2个条件:

1)有反复执行的过程(调用自身)

2)有跳出反复执行过程的条件(递归出口)

递归例子:

(1)阶乘

n! = n * (n-1) * (n-2) * ...* 1(n>0)

//阶乘int recursive(int i){ int sum = 0; if (0 == i) return (1); else sum = i * recursive(i-1); return sum;}(2)河内塔问题

//河内塔void hanoi(int n,int p1,int p2,int p3){ if(1==n) cout

从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。

如1,2,3三个元素的全排列为:

1,2,3

1,3,2

2,1,3

2,3,1

3,1,2

3,2,1

//全排列inline void Swap(int &a,int &b){ int temp=a; a=b; b=temp;}void Perm(int list[],int k,int m){ if (k == m-1) { for(int i=0;i

(4)斐波那契数列

斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……

这个数列从第三项开始,每一项都等于前两项之和。

有趣的兔子问题:

一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔子都不死,那么一年以后可以繁殖多少对兔子?

分析如下:

第一个月小兔子没有繁殖能力,所以还是一对;

两个月后,生下一对小兔子,总数共有两对;

三个月以后,老兔子又生下一对,因为小兔子还没有繁殖能力,总数共是三对;

……

依次类推可以列出下表:

//斐波那契

long Fib(int n)

{

if (n == 0)

return 0;

if (n == 1)

return 1;

if (n > 1)

return Fib(n-1) + Fib(n-2);

}


相关文章

  • 编译原理学习导论 [和讯博客]
  • 文章来源: 转贴www.csdn.net 大学课程为什么要开设编译原理呢?这门课程关注的是编译器方面的产生原理和技术问题,似乎和计算机的基础领域不沾边,可是编译原理却一直作为大学本科的必修课程,同时也成为了研究生入学考试的必考内容.编译原理 ...查看


  • 一个经典编程面试题的"隐退"
  • 面试程序员很困难.Jeff Atwood 抱怨找一个会写代码的候选人是如此艰难.在技术媒体发布的那些"最佳"面试题中,很少有能让我提起兴趣的--尽管我很喜欢IKEA的这个面试题.Codility和 Interview S ...查看


  • B5分治思想与递归算法的应用
  • 一.分治思想 例1.找伪币 [问题描述] 给你一个装有16个硬币的袋子,16个硬币中有一 个是伪造的,并且那个伪造的硬币比真的硬币要轻一 些. 你的任务是找出这个伪造的硬币. 为了帮助你完成这一任务,将提供一台可用来比 较两组硬币重量的仪器 ...查看


  • 算法设计与分析基础习题参考答案
  • 习题 1.1 5..证明等式 gcd(m,n)=gcd(n,m mod n)对每一对正整数 m,n 都成立. Hint: 根据除法的定义不难证明: 如果 d 整除 u 和 v, 那么 d 一定能整除 u±v; 如果 d 整除 u,那么 d ...查看


  • 计算机必读经典书籍
  • 国外程序员推荐:每个程序员都应读的书 发布时间:2011-12-20 00:10 来源:伯乐在线 分类: 程序员 3 条评论 » 编者按:2008年8月4日,StackOverflow 网友 Bert F 发帖提问:哪本最具影响力的书,是每 ...查看


  • 算法设计与分析基础习题参考答案 1
  • 习题1.1 5..证明等式gcd(m,n)=gcd(n,m mod n)对每一对正整数m,n都成立. Hint: 根据除法的定义不难证明: 如果d整除u和v, 那么d一定能整除u±v; 如果d整除u,那么d也能够整除u的任何整数倍ku. ...查看


  • 计算思维案例及平时成绩讨论题
  • 1.5本章计算思维的典型案例 案例1: 计算作为人类文明的开端,从最远古的手指计数到中国古代的算盘计算到近代西方的纳皮尔算筹及帕斯卡机械式计算机,至当前的电子计算机的高速度计算,不管是计算方法还是计算工具都有了变革性的创新,计算也作为一种思 ...查看


  • 排序比较次数的数据结构分析
  • 排序 排序问题的输入是一个线性表,该线性表的元素属于一个偏序集:要求对该线性表的元素做某种重排,使得线性表中除表尾外的每个元素都小于等于(或大于等于)它的后继. 设R 为非空集合A 上的二元关系,如果R 满足自反性(对于每一个x ∈A ,( ...查看


  • 程序员应该读的书
  • "如果能时光倒流,回到过去,作为一个开发人员,你可以告诉自己在职业生涯初期应该读一本,你会选择哪本书呢?我希望这个书单列表内容丰富,可以涵盖很多东西." 很多程序员响应,他们在推荐时也写下自己的评语.以前就有国内网友介绍 ...查看


热门内容