递归经典例子

程序调用自身的编程技巧称为递归( recursion)。 一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。用递归思想写出的程序往往十分简洁易懂。 一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。 注意: (1) 递归就是在过程或函数里调用自身; (2) 在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口,否则将无限进行下去(死锁)。 递归算法一般用于解决三类问题: (1)数据的定义是按递归定义的。(Fibonacci函数) (2)问题解法按递归算法实现。(回溯) (3)数据的结构形式是按递归定义的。(树的遍历,图的搜索) 递归的缺点: 递归算法解题的运行效率较低。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。 例一 1、 古典问题——有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第三年每个月的兔子总数为多少?(提示:兔子的规律为数列1,1,2,3,5,8,13,21....) 代码: class Program { static void Main(string[] args) { Program p = new Program(); Console.WriteLine(p.tuzi(7)); } public int tuzi(int n) { if (n == 1 || n == 2) { return 1; } else { return tuzi(n - 1) + tuzi(n - 2); } } } 例二 2、 趣味问题——年龄。有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?用递归算法实现。 代码: class Program { static void Main(string[] args) { Program p = new Program(); Console.WriteLine( p.age(5)); } /// /// 递归法求岁数 /// /// 有几个人 /// int age(int n) { int c; if(n==1) return 10; else { c = age(n-1)+2; return c; } } 例三 3、 趣味问题——猴子吃桃。海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子? 代码: class Program { static void Main(string[] args) { Program p = new Program(); Console.WriteLine( p.PeachNumber(5)); } /// /// 递归法求桃子数 /// /// /// int PeachNumber(int n) { if (n == 1) { //最后一个是至少是六个 return 6; } else { return (PeachNumber(n - 1) + 1) * 5; } } 例四 汉诺塔问题。汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。用C#编写一个程序,实现输出三个圆盘的汉诺塔移动步骤 static void Main(string[] args) { int li_disk_total; System.Console.Write("Please input disk total:"); int.TryParse(System.Console.ReadLine(),out li_disk_total); hanoi(li_disk_total, 'a', 'b', 'c'); System.Console.WriteLine("Move success"); System.Console.ReadLine(); } public static void hanoi(int n,char a,char b,char c) { if (n == 1) move(n, a, c); else { hanoi(n - 1, a, c, b); move(n, a, c); hanoi(n - 1, b, a, c); } } public static void move(int n,char x,char y) { System.Console.WriteLine("Disk " + n.ToString() + " from " + x + " move to " + y); }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/382133.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

golang中的栈(LeetCode刷题)

栈的模拟(LeetCode刷题用法) func main() {stack : make([]string, 0)stack append(stack, "1" )stack append(stack, "2" )stack append(stack, "3" )fmt.Println(stack)stack stack[:len(stack)-1]fmt.Println(sta…

739. 每日温度 golang (list实现)

739. 每日温度 根据每日 气温 列表,请重新生成一个列表,对应位置的输出是需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替。 例如,给定一个列表 temperatures [73, 74, 75, 71, 69, 72, …

openjudge基础题3计算书费

总时间限制: 1000ms内存限制: 65536kB描述下面是一个图书的单价表:计算概论 28.9 元/本数据结构与算法 32.7 元/本数字逻辑 45.6元/本C程序设计教程 78 元/本人工智能 35 元/本计算机体系结构 86.2 元/本编译原理 27.8元/本操作系统 43 元/本计算机网络 56 元/本JAV…

739. 每日温度 golang

739. 每日温度 根据每日 气温 列表,请重新生成一个列表,对应位置的输出是需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替。 例如,给定一个列表 temperatures [73, 74, 75, 71, 69, 72, …

查找和排序的一点浅显认识

以前老是混淆各种排序的方法,对此我也感到十分苦恼,去网上搜索各种排序教程,结果收获颇微,就在期末考试时,我还担心会有排序的题(事实证明我多虑了),不过作为算法的基本功&#xff0…

581. 最短无序连续子数组 golang

581. 最短无序连续子数组 给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。 你找到的子数组应是最短的,请输出它的长度。 示例 1: 输入: [2, 6, 4, 8, 10, 9, 15] …

引用 看图英语作文万能模板

来源:新东方 2007-7-27 纵观历年的考研作文题,均为图画作文,鲜有图表作文,而现在考研作文的要求采用八股文的模式——命题者已经告诉你要去写什么、怎么写甚至于顺序都已经安排 好!那么针对这么一个固化的考试模…

41. 缺失的第一个正数 golang

41. 缺失的第一个正数 给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。 示例 1: 输入: [1,2,0] 输出: 3 示例 2: 输入: [3,4,-1,1] 输出: 2 示例 3: 输入: [7,8,9,11,12] 输出: 1 Code 双百解法!这个题据说今日头条出过&#xff0…

Android手机隐藏命令大全

Android手机隐藏命令大全,用之前要考 虑清楚尤其是涉及到格式化或者恢复出厂设 置类的!注意:因Android版本较多,固有部分隐 藏命令或不能使用(笔者用HTC legend测试 发现部分命令可用,比如*#*#4636#*#*&…

56. 合并区间 golang

56. 合并区间 给出一个区间的集合,请合并所有重叠的区间。 示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6]. 示例 2: 输入: [[1,4],[4,5]] 输出: [[1,5]] 解释: 区间 [1,4] 和 …

忘记手势密码的解决办法

1.在输入密码的界面下方有个紧急呼叫按钮,点击进入紧急呼叫界面;2.输入*#*#7378423#*#*进入工程模式;3.依次选择customizationsettings--restcustomization--Resetcustomization and reboot,4.完成,自动重启!呼呼&…

15. 三数之和 golang

15. 三数之和 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a b c 0 ?请你找出所有满足条件且不重复的三元组。 注意:答案中不可以包含重复的三元组。 示例&#xff…

云盘搜索找资料

自己平时经常看英剧美剧和电影,为 了寻找资源方便,陆续整理收集汇总 的各类搜索方法(网站),现在分享 出来,感兴趣的可以看看~只要被上传到→百度云盘、360盘、 新浪微盘、115盘、华为盘、迅雷、 金山快盘等…

设计师必备的html工具

HTML 5已经成为Web开发者当中最流行的语言之一,“健壮的”语言有很大的生产优质万维网内容的能力。HTML 5在近三年的增长迅猛,新引入HTML 5的技术更加的优秀。HTML 5技术被现代浏览器所支持,如Chrome、Firefox、Internet Explorer等等。而今天…

42. 接雨水 golang

42. 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表…

257. 二叉树的所有路径 golang

257. 二叉树的所有路径 给定一个二叉树,返回所有从根节点到叶子节点的路径。 说明: 叶子节点是指没有子节点的节点。 示例: 输入: 1/ \ 2 3\5输出: [“1->2->5”, “1->3”] 解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3 Code…

dp题目分类

动态规划一般可分为线性动规,区域动规,树形动规,背包动规四类。举例:线性动规:拦截导弹,合唱队形,挖地雷,建学校,剑客决斗等;区域动规:石子合并&a…

349. 两个数组的交集 golang

349. 两个数组的交集 给定两个数组,编写一个函数来计算它们的交集。 示例 1: 输入: nums1 [1,2,2,1], nums2 [2,2] 输出: [2] 示例 2: 输入: nums1 [4,9,5], nums2 [9,4,9,8,4] 输出: [9,4] 说明: 输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结…

poj 1018 Communication System

首先做这个题是极其难受的,第一次去做dp的题,万事开头难,虽然以前也接触过dp,但是都极力躲避着用其他算法解决,现在专门练这部分,倒觉得,你拍什么,什么就会比想象中难很多&#xff0…

大娱乐家

大娱乐家屏幕上跳动的光标,不知道有多久我没有这样安静一会了,也不知多久没在记录那些生活中意味深长的事了,翻转脑海,却发现是一团糟,总有理还乱的错觉,我不知道自大学以来是我实在没经历那种一下子就让人…