算法和程序实践习题解答8(递归)_new.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
目 录 CS81:菲波那契数列 1 CS82:二叉树 3 CS83:逆波兰表达式 5 CS84:放苹果 6 CS85:红与黑 8 CS86:八皇后问题 10 CS87:木棍问题 15 CS88:城堡 18 CS89:分解因数 22 CS810:迷宫 24 CS811:算24 28 CS812:文件结构“图” 30 CS813:小游戏(未做) 34 CS814:碎纸机 35 CS815:棋盘分割 39 CS816:棋盘问题 42 CS817:猴子吃桃 44 CS818:最大公约数 45 CS819:经典的Hanoi(汉诺塔)问题 47 CS820:练习题 49 CS821:另一个Fibonacci数列 50 CS822:分形(Fractal) 51 CS823:欧几里德游戏(Euclid’s Game)(未做) 54 CS824:幸存者游戏(Recursive Survival) (未做) 55 CS825:抽签(Lot) (未做) 55 CS826:骨头的诱惑(Tempter of the Bone) 56 CS827:图形周长(Image Perimeters) 59 CS828:礼物(Gift) 60 CS829:火力配置网络(Fire Net) 60 CS830:素数环问题(Prime Ring Problem) 61 CS831:保险箱解密高手(Safecracker) 61 CS832:方形硬币(Square Coins) 62 CS833:求和(Sum It Up) 62 CS834:正方形(Square) 63 CS835:字母排列(Anagram)(未做) 66 CS836:抽奖游戏(Lotto)(未做) 66 CS837:分配大理石(Dividing)(未做) 67 《算法与程序实践2》习 题 解 答8——递归 让我们来看看计算n的阶乘的计算机程序的写法。在数学上,求n的阶乘,有两种表示方法: (1)n!=n*(n-1)*(n-2)*…*2*1 (2)n!=n*(n-1)! (0!=1) 这两种表示方法实际上对应到两种不同的算法思想。 在第(1)种表示方法中,求n!要反复把1、2、3、…、(n-2)、(n-1)和n累乘起来,是循环的思想,很直接地我们会用一个循环语句将n以下的数都乘起来: int n,m = 1; for(int i = 2; i = n; i++) m *= i; printf(“%d 的阶乘是%d\n”, n, m); 在第(2)种表示方法中,求n!时需要用到(n-1)!,所以可以用下面的方法来求n的阶乘: int factorial(int n){ if(n = 0) return(-1); if(n == 1) return 1; else return n*factorial(n - 1); } 上面这两种实现方式体现了两种不同的解决问题的思想方法。第一种通过一个循环语句来计算阶乘,其前提是了解阶乘的计算过程,并用语句把这个计算过程模拟出来。第二种解决问题的思想是不直接找到计算n的阶乘的方法,而是试图找到n 的阶乘和n-1 的阶乘的递推关系,通过这种递推关系把原来问题缩小成一个更小规模的同类问题,并延续这一缩小规模的过程,直到在某一规模上,问题的解是已知的。这样一种解决问题的思想我们称为递归的思想。 递归方法的总体思想是将待求解问题的解看作输入变量x的函数f(x),通过寻找函数g,使得f(x) = g(f(x-1)),并且已知f(0)的值,就可以通过f(0)和g求出f(x)的值。这样一个思想也可以推广到多个输入变量x,y,z等,x-1也可以推广到x - x1,只要递归朝着出口的方向走就可以了。 用递归的方法可以求解具有递推关系的问题,此外,还可以广泛应用在搜索领域和排列组合领域。 第一次讲课:CS817/CS818/CS819/CS821/CS822 练习:CS820 第二次讲课:CS81/CS82/CS83/CS84 练习:CS85/CS88/CS89 CS81:菲波那契数列 (来源:poj.grids.cn 2753,程序设计导引及在线实践(李文新)例9.2 P198) 问题描述: 菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。 给出一个正整数a,要求菲波那契数列中第a个数是多少。 输入: 第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数a(1 = a = 20)。 输出: 输出有n行,每行输出对应一个输入。输出应是一个正整数,为菲波那契数列中第a个数的大小。 样例输入: 4 5 2 19 1 样例输出: 5 1 4181 1 解

文档评论(0)

0520 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档