利用递归思想解决计数问题
递归算法例子
递归算法例子1. 哎呀,你知道计算阶乘吧!比如说 5 的阶乘就是5×4×3×2×1,这用递归算法就很合适呀!就像你一层一层地剥开洋葱一样,先计算 5 的阶乘,它又调用 4 的阶乘,一直这样递归下去,直到计算到 1 的阶乘!是不是很神奇啊?2. 嘿,你想想画一棵树,从树干开始不断长出树枝,这和递归算法多像呀!比如计算树的节点数量,一个节点会有子节点,然后子节点又有它的子节点,这就是在不断地递归呀!就像不停地探索未知一样,有趣吧?3. 哇哦,斐波那契数列知道吧!1,1,2,3,5,8 这样的,它用递归算法简直绝了啊!前两个数相加得到后面一个数,每次计算都要依靠前面的结果,这不就是递归在发挥神奇作用嘛!你说棒不棒?4. 嘿呀,拼图游戏玩过吧!当你一片片去组合的时候,其实也有点像递归算法呢!从局部到整体,一点点拼凑起来,这和递归的层层递进不是很像吗?比如要找出完整图案,就需要不断递归探索各个部分呀!5. 呐,汉诺塔游戏了解一下呀!要把盘子从一个柱子移到另一个柱子,这过程中就是递归在帮忙呢!每一步的移动都像是在打开一个新的递归之门,让整个过程充满挑战和乐趣,你难道不想试试吗?6. 哦哟,走迷宫的时候是不是感觉很奇妙?递归算法在这当中也能大显身手哦!比如找到走出迷宫的路径,就是不断尝试,不断递归,就像在黑暗中寻找光明一样刺激,不是吗?7. 嘿,文件系统的目录结构见过吧!从根目录到子目录,再到更下一级的目录,这多像递归呀!就像不断深入一个神秘的世界,每一次递归都是一次新的发现,是不是很有意思呢?8. 哇,你想想搜索一个大的数据集,用递归算法来查找特定的元素,那感觉就像是大海捞针,但又充满希望!每一次递归都是一次新的尝试,就像在茫茫人海中寻找那个特别的人一样,会带来惊喜哦!9. 总之呢,递归算法真的是无处不在,非常神奇!它能让复杂的问题变得简单有趣,能让我们看到问题的本质和内在联系。
递归函数的应用与注意事项
递归函数的应用与注意事项递归函数是一种非常重要且常用的编程技巧,它在解决一些问题时能够提供简洁、高效的解决方案。
然而,递归函数的使用也需要注意一些细节和注意事项,以确保程序的正确性和性能。
本文将探讨递归函数的应用场景以及在使用递归函数时需要注意的事项。
一、递归函数的应用场景1. 数学问题求解:递归函数在解决数学问题中非常常见。
例如,计算斐波那契数列的第n项,可以使用递归函数来实现。
递归函数可以将复杂的问题简化为相同类型的子问题,从而提高代码的可读性和可维护性。
2. 数据结构操作:递归函数在处理数据结构时也非常有用。
例如,在二叉树的遍历中,可以使用递归函数来实现前序、中序和后序遍历。
递归函数可以帮助我们逐层遍历树的节点,从而实现对树的各种操作。
3. 字符串处理:递归函数在字符串处理中也有广泛的应用。
例如,判断一个字符串是否是回文串,可以使用递归函数来逐个比较字符串的首尾字符。
递归函数可以帮助我们简化字符串处理的逻辑,提高代码的可读性。
二、注意事项1. 递归终止条件:递归函数必须有一个明确的终止条件,否则会陷入无限递归的循环中。
在编写递归函数时,要确保终止条件能够正确判断递归的结束,避免出现死循环。
2. 递归调用的层数:递归函数的调用层数不能太多,否则会导致栈溢出的问题。
每次递归调用都会占用一部分栈空间,当递归层数过多时,栈空间可能会耗尽。
因此,在使用递归函数时,要注意对递归调用层数的控制。
3. 递归函数的性能:递归函数在某些情况下可能会导致性能问题。
递归函数的调用过程中会频繁地进行函数调用和返回,这会增加函数调用的开销。
在某些情况下,可以考虑使用迭代或其他方法来替代递归函数,以提高程序的性能。
4. 递归函数的参数传递:在使用递归函数时,要注意参数的传递方式。
递归函数的参数传递可以通过值传递或引用传递来实现。
在某些情况下,如果参数传递不当,可能会导致递归函数的行为不符合预期,因此要注意参数传递的方式。
用递归解决出栈序列计数和输出问题
伊 犁师 范学院 学报 (自然科 学版 )
2 0 1 5 ‘ 年
3 栈 的计数
3 . 1 栈大 小不 受 限制
在 栈 大小 不受 限制情 况下 ,关于 出栈序 列 的计 数 问题 , 目前 主要 是通 过一 一对 应 的方 法将 计数 问 题 归 结 为 Ca t a l a n 数 的 计 数 问 题 , 其 结 果 为
的计 数 和输 出 问题 .
序列 长度 时 , 出栈 序列 首先 需要 满 足性 质 1 ,然
后考 虑栈 大 小受 限对 出栈 序 列 的要求 .例 如 ,有 长
度 n=6的入栈 序列 1 2 3 4 5 6 ,栈 的大 小 k=4,此 时 出栈 序列 的第 一位 不 能超 过 元素 4 , 即出栈 序列 第
中图分 类 号 :T P 3 1 1 文献 标识 码 :A 文章 编号 : 1 6 7 3 -9 9 9 X( 2 0 1 5 )O 1 —0 0 6 7 —0 4
当栈大 小不 受 限制 时 ,依据 栈 的特 点 ,较 容 易
1 引 言
栈 是 限 定 仅 在 表 尾 端 进 行 插 入 或 删 除操 作 的
Ma r . 2 O1 5
V o 1 . 9 No . 1
用 递 归解 决 出栈序 列计 数和 输 出 问题
王 文 龙
( 喀 什 师 范 学 院 信 息 工 程技 术 系 ,新 疆 喀 什 8 4 4 0 0 0)
摘 要:在栈大小不受限制和栈 大小受限制两种情况下,分析在给定入栈序列 ( 1 2… n ) 的情况下,出栈序列应满足的性质 ,并据此给 出基于递归的 出 栈序列计数和输 出的算法及程序 实 现. 算 法较 直观 ,易于理 解. 关键词 :栈 ;出栈序列;降序 ;递归;算法 ;程序
递归计数的六种方式
中等数学i叙含活劫係歿鉼雇丨递归计数的六种方式中图分类号:〇141.3冯跃峰(广东省深圳市福田区,518038)文献标识码:A文章编号:1005 - 6416(2020)08 - 0002 -10(本讲适合高中)计数是组合中的常见问题,而递归计数 则是其常用方法.所谓递归,就是建立“,的问题与“小于 ,的若干同构子问题之间的等量关系.本文 举例介绍六种数学竞赛中常用的递归方式.1增减元递归在n的情况中减少或增加一个元素,转 化为n_l(或.1+ 1)的情况.一般采用减首项(排在最前的元素或步骤)的方式建立递归:先考虑首项的取值,再 将后面若干项捆绑,看作〃-1的情况处理.但若n的问题必须先完成n- 1的问题 时,则采用减末项递归.例1记[>]表示不超过实数%的最大整数.对给定的正整数〃,计算2k^n-2h3【分析】由代表项C f3"_2A的组合意义想 到构造如下的组合问题:用1、2、3、4可以组 成多少个含有偶数个1的n位数?-方面,设有M 0^彡丨个1.则从n个位置中取2A个位置排1,有C f种方法,剩下的个位置可排2、3、4,均有3种方 法•故含有放个1的W立数的个数为C f3"_-2k注意到,〇彡叫f从而,符合条件的n位数的个数为m= S c f3-2A.k=0另一方面,采用“递归”的方式计算设W立数为,考虑首位a.若首位排1,则后面的n-1位数中只有 奇数个1.由于偶数个1的n - 1位数有a…_, 个,故奇数个1的《- 1位数有个;若首位不排1,则有3种排法,后n - 1位数有偶数个1,有种排法,此时,有 3(^4种排法.故。
… = (4’卜丨-〜,—。
十]。
=4"-' +2^.,.①由式①,知数列- 2^4丨是公比为4 的等比数列.于是,an ~2an-i=4(fln-i -2a n_2)-由此变形得a n ~4a n-l=2(°…-1~4a n-2)=(a2-4a1)2n-2 = (10-4x3)2n'2=-T'\联立式①、②解得a… =2x4n_1 +2n_1②[f]故 S c f3"_2k:2 x4,,_1 +2n_1.t=0收稿日期:2020 - 05 -18当然,解此递归方程还有另外的方法: 式①两端同时除以4"得2020年第8期3a n1,1^a n-lm v,此即常见递归形式心+1可转化为 等比数列求解.2容斥递归为计算《时的计数对象的个数a…,先计 算满足部分条件的“拟对象”个数,再从中 减去不满足余下条件的“坏对象”个数人,有 = 4 _ 人.在计算■/,,时,如果可以转化为原问题在n-1时的计数,则得到Jn =/(〇…-l)-由此建立递归:a… =/… - /(a^)•例2将圆划分为n个扇形,用r种颜色对 扇形染色,每个扇形染一种颜色,且任何两个 相邻的扇形不同色.问:有多少种染色方法?【分析】按圆周排列的n个扇形可记为(皂,…,4),其中4(1矣与4+1相 邻•染色要求4(14心)与禹+1异色,先适 度“放宽”这一要求,再构造“拟染色”:要求 4(1A d1)与卓+1异色,其中可能含有 疋与岑同色的情况,将这种染色去掉即可,它恰好是时情况与原问题同构的染色问题.设有&种满足条件的染色方法.则Xl =ry X2 =r(r- l).对>3 ),扇形岑有r种染色方法,扇形4与次不同色,有r-1种染色方法; ……扇形4与扇形纪―不同色,有r-1种 染色方法.故共有种染色方法.但其中\可能与岑同色,此时,将扇形 \与扇形岑合并看作一个扇形,它恰是n- 1个扇形满足条件的染色方法,有^^种.于是,= r(r-l广1(ra>3).(这要求n-1 >1,否则无法有岑与人同色扇形的捆绑(尽管有A =「,但无递推式 〜+x2 =r(r-l)).故 +a j… =r(r-l)"_1(n^3).)利用“交错加减”可求通项,但需要讨论 ^的奇偶性.下面介绍一种避免讨论n奇偶性的方法.注意到,%2+x3= r(r - 1 )2,①久:3+ 尤4= /*(/*一 1 ) 3,②xn-i +xn=r(r c〇>式〇(1☆•矣n-2)乘以(-1广1得(-1 ) 2尤2+ ( - 1 )2% = r( 1- r)2,(-1)3% + (-i)'\ = K i -O3,+ (-\)n~X xn=r(l-r)各式相加得^2 + (_ 1)"1:K n= (l-r)2-(l-r)n= (r-l)2+ (-l)n+1(r-l)n.又 x2= r(r - 1 ),贝丨J(-1广、…= (r-l)2+ (-l)n + 1(r-l)n-r(r-l),^= (-l)"'1(/--l)2+ (r-l)n+(-l)V(r-l)= (r-l)"+ (-l)n(r-l)(n^3).又;i = 2时,上式也成立.而n = 1时,a=r,故r(r - 1 )" + (r - 1 ) (- 1 )n, n^2;X n~j r,n =1.3分拆递归将计数对象的存在域分解为若干个与原 区域同构的子区域建立递归.例3(欧拉剖分)用对角线将凸n边形 剖分为n-2个三角形,有多少种不同的方法?【分析】用&表示凸A边形的剖分数,且4中等数学规定A = 1.由于多边形的每一条边都必属于一个剖 分三角形,则考虑〃边形岑毛…圮的边岑七所在的剖分三角形,设为A4岑如图1.4于是,的一侧是一个边形的剖分,另一侧是一个n+ l -/c边形的剖分,它 们分别有&、&+1_A种剖分方式.从而,凸n 边形含有剖分三角形△4岑火的剖分数为^k^n + l-k'注意到A可取2,3,…,n- 1.从而,得到递推式+E3En_2+." +En-tE2.①上述方法的核心步骤是:△纪次火将原多边形分割为两个边数较小的多边形,从而 得到与原问题同构的子问题,由此建立递归,称之为“分割递归下面思考:能否得到原多边形的另一种分割方式?利用原多边形的对角线,比如从 A出发的对角线岑4所不同的是,原来分割 所借用的事实是剖分中一定含有A纪A火,而换成对角线小4进行分割时,并不能保证 “剖分中一定含有对角线4火”.因而,要穷 举更多的分割方式.假定凸〃边形岑4…<的剖分中含有从顶点岑出发的对角线.如图2,设该对角线为 /M t(3矣A矣n-1)•则该对角线的一侧是& 边形的剖分,另一侧是n+2- A边形的剖分. 于是,凸〃边形含对角线皂火的剖分方法数为 EkEn+2_k.A,注意到,A:可取3,4,…,7i-l.故凸n边形含从顶点山出发的对角线的剖分数为A h + E4A n_2 +…+ f 3.由对称性,知含从顶点冷(_/= 1,2,…,ra)出发的对角线的剖分数也为五3^-1 +芯人-2 +…+五n-l芯3-于是,凸n边形的所有剖分总数为n(芯3&-1 +五4人-2 + …+U3).以上计算有重复.因为每条对角线有两个顶点,计算了 2次;又凸《边形的剖分含有 n-2个三角形(由多边形内角和可知),于 是,含有《-3条对角线(A:条不相交对角线将多边形分割为A+ 1块),计算了 n-3次.则每个剖分被计数2(« -3) = 2n-6次.t jC K=2n T6(E3K-' +^^-2 +- +f3). ②利用式①、②,可求出心.其中注意:式①、②“隐含”很多相同处.将式①中的n换 成+ 1得^+i =^2^n+^3^-1 + ■"+En.x E3+En E2.再变形为En+i~2En =E3En_l+E4E n_2+--- +En_x Ey代入式②得依次迭代得2E0^n+i = (4n-6) (4n- 10)----—2020年第8期5_9n-. (2n-3)!!—n\_ t (2n-2)!!-(2n-3)!!一(2/1-2)!!.n!(2n-2);_C2n;_2(n - 1) ! •几!n故心=4,其中A+2 =c n =4称 为卡特兰数.4分段递归分段递归类似于分段函数,当n属于不 同类时,递归关系表达式不同,表现形式为:A;g(an_l,--,a n_k) , n e B.例4设/(n)是定义在正整数集上的函 数,且对于任何正整数〃,均有/(1)=/(2)=1,/(3n)=/(ra) + 2 020,/(3n + l) = 3/(n) + 2 019,f(3n+2) = 2 019/(n).令人={i l l矣i矣n,/(i)为奇数丨,化=| il K矣n,/(i)为偶数}.(1) 证明:对于任何正整数n,均有14丨>丨5…丨;(2) 试确定/(2 019)的奇偶性.【分析】由I4J的意义,知(1)实际上是 证明数列{/(/i)丨的前n项中为奇数的项多于为偶数的项.由于目标中只关心数列|/(n)丨各项的奇偶性,从而,可用模2来处 理题给的递归关系,有/(1)=/(2)= 1,/(3n) =/(ra) (mod 2),f(3n + 1) =f(n)+ 1 (mod 2),/(3n +2) =f(n) (mod 2).当n = 1,2,…,18时,/(n)的奇偶性如 表1所示,其中,1表示奇数,〇表示偶数.表1n123456789f(n)111011011n101112131415161718f i n)010101011由此发现:〇的分布很“稀疏”—任何 两个0不相邻.为证明这一结论,将表1中的 数都用三进制表示,得到表2.表2n12101112202122100 f(n)111011011n101102110111112120121122200 A n)010101011观察那些使/(«)为偶数的三进制数n 构成的子列:^ = 11,21,101,110,112.可发现:使/(»)为偶数的三进制数n,其 三进制除去首位后,各数字和均为奇数.进一步发现上述性质也适用使/( n)为 奇数的三进制数〜其三进制除去首位后,各 数字和均为偶数.对于〃的三进制数:n = (aka k-l —¥〇)3((^#0),定义:(«) = %_, +a4_2 + …+ A +a。
递归算法题目
《递归算法题目》
同学们,今天咱们来聊聊递归算法题目。
啥是递归算法呢?简单说,就是一个函数自己调用自己。
听起来有点绕,对吧?别担心,咱们通过例子来理解。
比如说,计算阶乘。
咱们要算 5 的阶乘,也就是5! 。
正常算法是
5×4×3×2×1 ,那用递归算法呢,就是这样:先定义一个函数,假设叫factorial ,如果要算n 的阶乘,当n 等于0 或者 1 时,结果就是 1 ;如果n 大于 1 ,那结果就是n 乘以factorial(n - 1) 。
再比如,计算斐波那契数列。
这个数列前两个数是0 和 1 ,从第三个数开始,每个数都是前两个数的和。
用递归算法,咱们也能搞定。
那为啥要学递归算法呢?因为它能让一些复杂的问题变得简单。
就像走迷宫,有时候直接往前走找不到出口,但是退一步,换个角度,可能就柳暗花明啦。
不过,递归算法也有它的小麻烦。
要是不小心,可能会陷入无限循环,就像在一个圈圈里一直转,出不来啦。
那怎么才能做好递归算法的题目呢?首先,得把问题分析清楚,搞明白啥时候该停止递归。
然后,要仔细设计递归的条件和步骤。
同学们,递归算法就像一把神奇的钥匙,能打开很多难题的大门。
只要咱们多练习,多思考,就一定能掌握它,让它为咱们的编程之路助力!
加油吧,同学们,相信你们都能搞定递归算法题目!。
递归的经典例子
递归的经典例子
1. 算数学题的时候啊,像计算一个数的阶乘,这就是一个递归的经典例子呀!比如说计算 5 的阶乘,不就是 5 乘以 4 的阶乘嘛,而 4 的阶乘又等于 4 乘以 3 的阶乘,依次类推,这多有意思啊!
2. 还有走迷宫呢,你想想,当你在迷宫里遇到岔口,你选择一条路走,然后又遇到岔口,又继续选择,这不就跟递归很像嘛!你不断地进入更小的问题去探索,直到找到出口,这难道不是很神奇吗?
3. 画树也可以用递归呀!先画一个树干,然后树干上又分出树枝,每个树枝又可以当作新的树干去继续分树枝,这不就跟递归的过程一样嘛,哇塞,这样就能画出一棵复杂又漂亮的树啦!
4. 你知道汉诺塔游戏不?那就是典型的递归例子哟!要把盘子从一个柱子移到另一个柱子,不就得不断地用递归的方法去解决嘛,天啊,真是好烧脑又好有趣!
5. 再来说说我们电脑里的文件系统,那也是递归的体现呀!文件夹里有子文件夹,子文件夹里还有子文件夹,就这么一层层下去,像不像递归在大展身手呢?
6. 回忆一下我们看电影的时候,很多故事里不是也有类似递归的情节嘛!主角解决一个问题又引出新的问题,然后一直这么循环,这也可以说是一种故事里的递归呀,多有意思的发现呀!
总之,递归在生活中无处不在,它就像一把神奇的钥匙,能打开很多复杂问题的大门,给我们带来惊喜和挑战!。
简单递归例子
简单递归例子
1. 嘿,你知道计算阶乘吧,那就是个简单递归例子呀!比如说,计算 5 的阶乘,不就是 5 乘以 4 的阶乘嘛,4 的阶乘又是 4 乘以 3 的阶乘,一直
这样递推下去,直到 1 的阶乘就是 1,多神奇呀!
2. 哎呀呀,斐波那契数列也是呢!前两个数是 0 和 1,后面每个数都
是前两个数的和,这就是妥妥的递归呀!你想想,像不像搭积木,一层一层搭起来的感觉。
3. 还有走迷宫!当你在一个岔路口选择一条路走下去,如果碰到死胡同,就回到岔路口再选另一条路,这也有点递归的味道啊,是不是很有意思呢?
4. 你看画树的例子呀!先画一个主干,然后从主干上再长出分支,每个分支又可以长出更小的分支,这不就是用递归在构建嘛!
5. 计算最大公约数也能用递归呢!如果两个数不相等,就把大的数变成大的数减去小的数,小的数不变,然后再去算,这不就是在反复进行一个过程嘛,多酷!
6. 就说汉诺塔问题吧!把盘子从一个柱子移动到另一个柱子,不也得靠递归的思路嘛!这就像接力赛,一环扣一环的。
7. 像倒着数数也是呀!从 10 数到 1,不就是每次减去 1 然后接着数,这也是一种简单的递归呀!
8. 你瞧,生活中好多地方都有递归的影子呢!这真的很神奇,不是吗?简单的递归例子就在我们身边呀,让我们发现更多有趣的递归吧!
我的观点结论:递归在很多地方都有体现,而且非常有趣,大家可以多多留意去发现呀。
c语言,使用递归方法,求n的累加
c语言,使用递归方法,求n的累加1.引言1.1 概述概述部分的内容可以描述本文的主要内容和目标。
可以按照以下方式编写:概述在计算机科学中,递归是一种常用的问题解决方法。
它通过将一个问题分解为一个或多个相同类型的子问题,并通过解决这些子问题来解决原始问题。
在本文中,我们将探讨如何使用递归方法求解一个常见的问题:求n的累加。
本文主要介绍了递归方法以及如何在C语言中使用递归方法来进行求解。
递归方法的核心思想是将一个大问题分解为更小的子问题,并且每一个子问题都可以通过调用相同的函数来解决。
在C语言中,递归方法可以通过函数的自我调用来实现。
通过本文的学习,读者将了解到递归方法的基本原理和应用场景。
此外,我们将详细介绍如何在C语言中编写递归函数求解n的累加问题,并通过具体的示例代码来演示其实现过程。
最后,本文将对递归方法的优缺点进行总结,并对求解n的累加问题的结果进行分析。
通过本文的学习,读者将能够更好地理解递归方法的思想,并能够灵活运用该方法解决实际问题。
接下来,我们将首先介绍递归方法的基本概念和原理,然后详细讨论如何在C语言中使用递归方法求解n的累加问题。
让我们开始吧!1.2 文章结构2. 正文2.1 递归方法的介绍2.2 C语言中的递归方法2.1 递归方法的介绍递归是一种算法或函数调用自身的方式。
它在解决问题时,将问题分解为相同类型的子问题,并通过不断调用自身来解决这些子问题,最终得到原始问题的解答。
递归方法一般包括两个要素:基本条件和递归条件。
基本条件是指递归结束的条件,当满足这个条件时,递归将停止。
递归条件则是指问题分解的规则或方式。
递归方法常应用于数学、计算机科学和编程等领域。
它能够有效地解决一些具有重复性质的问题,使问题的解决过程更加简洁和优雅。
2.2 C语言中的递归方法在C语言中,递归方法的使用需要遵循一定的规则。
首先,递归方法必须具备基本条件,否则将导致无限递归,最终导致栈溢出。
其次,在递归方法中,需要将原始问题通过子问题的方式进行分解,直到满足基本条件。
递归算法解决问题
递归算法解决问题递归算法是一种解决问题的重要方法,它的特点是在解决问题的过程中,可以调用自身来解决子问题。
这种方法通常可以使问题的解决过程更加简洁明了,但也需要注意递归的边界条件以及递归深度的控制,以避免陷入无限循环的情况。
在计算机科学中,递归算法被广泛应用于各种领域,比如树的遍历、图的搜索、动态规划等等。
下面我们将以几个具体的例子来说明递归算法的使用。
我们来看一个经典的例子——计算斐波那契数列。
斐波那契数列是一个递归定义的数列,它的前两个数是0和1,从第三个数开始,每个数都是前两个数之和。
可以用递归算法来计算斐波那契数列的第n个数,代码如下:```pythondef fibonacci(n):if n <= 1:return nelse:return fibonacci(n-1) + fibonacci(n-2)```在这个递归函数中,当n小于等于1时,直接返回n;否则,就将问题拆分为求解第n-1个数和第n-2个数的和。
通过不断地递归调用自身,最终可以得到问题的解。
接下来,我们来看一个更复杂的例子——汉诺塔问题。
汉诺塔是一个经典的数学问题,它可以用递归算法来求解。
问题的描述如下:有三根柱子A、B、C,初始时柱子A上有n个盘子,这些盘子按照从小到大的顺序叠放在一起。
现在要将这些盘子从柱子A移动到柱子C,可以借助柱子B作为中转。
移动的规则是每次只能移动一个盘子,且大盘子不能叠在小盘子上面。
代码如下:```pythondef hanoi(n, A, B, C):if n == 1:print("Move disk", n, "from", A, "to", C)else:hanoi(n-1, A, C, B)print("Move disk", n, "from", A, "to", C)hanoi(n-1, B, A, C)```在这个递归函数中,当n等于1时,直接将盘子从柱子A移动到柱子C;否则,将问题拆分为三个子问题,先将n-1个盘子从柱子A 移动到柱子B,然后将第n个盘子从柱子A移动到柱子C,最后将n-1个盘子从柱子B移动到柱子C。
递归求解单链表中的结点个数
递归求解单链表中的结点个数递归求解单链表中的节点个数在计算机科学中,递归是一种解决问题的方法,它把一个问题分解为更小的子问题,并通过不断调用自身解决这些子问题。
本文将介绍如何使用递归的方法来求解单链表中的节点个数。
一、递归的基本原理递归是一种解决问题的方法,它通过将原问题划分为同样结构的子问题来解决。
递归函数在执行过程中调用自身,并通过不断缩小问题规模来解决问题。
在递归函数中,需要定义递归终止条件,以防止无限递归。
二、单链表单链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据域和指向下一个节点的指针。
单链表的最后一个节点指向空节点,表示链表的结束。
三、递归求解单链表节点个数的方法为了递归求解单链表中的节点个数,我们可以定义一个递归函数。
该函数的作用是计算从当前节点开始的子链表中的节点个数,并将结果返回。
具体步骤如下:1. 如果当前节点为空节点,则返回0;2. 否则,递归调用函数,计算从当前节点的下一个节点开始的子链表中的节点个数,并将结果保存;3. 返回子链表中的节点个数加1。
通过上述步骤,我们可以使用递归求解单链表中的节点个数。
下面是一个示例代码:```pythondef count_nodes(node):if node is None:return 0else:return count_nodes(node.next) + 1```四、递归求解单链表节点个数的示例为了更好地理解递归求解单链表节点个数的方法,我们可以使用一个简单的示例来演示。
假设我们有一个包含5个节点的单链表,每个节点的数据域依次为1、2、3、4、5。
下面是求解节点个数的示例代码:```pythonclass Node:def __init__(self, data):self.data = dataself.next = Nonedef count_nodes(node):if node is None:return 0else:return count_nodes(node.next) + 1 # 创建单链表head = Node(1)node2 = Node(2)node3 = Node(3)node4 = Node(4)node5 = Node(5)head.next = node2node2.next = node3node3.next = node4node4.next = node5# 求解节点个数count = count_nodes(head)print("节点个数为:", count) # 输出结果为5```在上述示例中,我们首先定义了一个`Node`类来表示单链表的节点。
递归问题实验报告
一、实验目的1. 理解递归算法的基本概念和原理。
2. 掌握递归算法的设计方法和实现技巧。
3. 通过具体实例,加深对递归算法在实际问题中的应用。
二、实验内容本次实验主要针对递归算法在排序、查找和数学问题中的应用进行探讨。
1. 排序问题(1)实验目的:使用递归算法实现快速排序。
(2)实验原理:快速排序是一种分而治之的排序算法。
其基本思想是:选取一个基准元素,将数组分为两个子数组,一个子数组的所有元素都比基准元素小,另一个子数组的所有元素都比基准元素大,然后递归地对两个子数组进行快速排序。
(3)实验步骤:① 定义一个递归函数,用于实现快速排序;② 在递归函数中,选择基准元素,并根据基准元素将数组分为两个子数组;③ 递归地对两个子数组进行快速排序;④ 输出排序后的数组。
(4)实验结果:通过实际编程,验证快速排序算法的正确性。
2. 查找问题(1)实验目的:使用递归算法实现折半查找。
(2)实验原理:折半查找是一种基于二分查找思想的递归查找算法。
其基本思想是:将待查找的序列分为两个子序列,然后确定目标值所在子序列,递归地对子序列进行查找。
(3)实验步骤:① 定义一个递归函数,用于实现折半查找;② 在递归函数中,根据目标值与中间元素的比较结果,确定目标值所在子序列;③ 递归地对子序列进行查找;④ 输出查找结果。
(4)实验结果:通过实际编程,验证折半查找算法的正确性。
3. 数学问题(1)实验目的:使用递归算法求解斐波那契数列。
(2)实验原理:斐波那契数列是一个著名的数列,其递推公式为:F(n) = F(n-1) + F(n-2),其中F(1) = 1,F(2) = 1。
(3)实验步骤:① 定义一个递归函数,用于计算斐波那契数列的第n项;② 在递归函数中,根据n的值,计算斐波那契数列的第n项;③ 输出斐波那契数列的第n项。
(4)实验结果:通过实际编程,验证斐波那契数列递归算法的正确性。
三、实验总结1. 通过本次实验,我们对递归算法的基本概念和原理有了更深入的理解。
【算法分析】递归算法的几个经典例子
【算法分析】递归算法的⼏个经典例⼦例⼀:整数划分问题 将正整数n表⽰成⼀系列正整数之和:n=n1+n2+…+nk,其中n1≥n2≥…≥nk≥1,k≥1。
正整数n的这种表⽰称为正整数n的划分。
求正整数n的不同划分个数。
例如:正整数6有如下11种不同的划分:6;5+1;4+2,4+1+1;3+3,3+2+1,3+1+1+1;2+2+2,2+2+1+1,2+1+1+1+1;1+1+1+1+1+1在本例中,如果设p(n)为正整数n的划分数,则难以找到递归关系,因此考虑增加⼀个⾃变量:将最⼤加数n1不⼤于m的划分个数记作q(n,m)。
下⾯对可能出现的四种情况进⾏分析:① m=1: 当m等于1时,对n的划分只可能1+1+1+……+1这⼀种情况。
②m>n时: 当m⼤于n时,由于划分中不可能出现负数,所以{n1, n2, n2,… , nk}(n = n1+n2+n3+……+nk)只可能出现⼩于等于n的整数。
故有q(n, m)=q(n, n)⑤m=n时: 当m等于n时,包含n⾃⾝的划分和没有n的划分两个部分。
⽽包含n⾃⾝的划分只有⼀种情况,故有有q(n, n)=1+q(n,n-1)④m<n时: n的m划分有包含m和不包含m两个部分。
其中包含m的部分⽤集合可表⽰为{m, {x1, x2, x3, 4,…, xk}}(其中x1+x2+……+xk=n-m)【详解见图1】,这部分的划分数为q(n-m, m);⽽不包含m的划分中,最⼤值不能为m,故划分数就等于q(n, m)。
所以在m<n时整数n的划分数为:q(n, m)=q(n, m-1)+q(n-m, m)。
【图1:ipad坏了,⼀时找不到纸,后⾯再补吧。
】递归求整数划分:1int q(int n, int m){2if(m==1){3return1;4 }5else if(m>n){6return q(n,n);7 }8else if(m==n){9return q(n,n-1)+1;10 }11else if(m<n){12return q(n-m, m)+q(n,m-1);13 }14 }。
递归求位数
递归求位数
首先,递归是一种算法,它可以将问题分解成更小的问题并解决
它们,直到到达基本情况为止。
如果我们想要求一个整数有多少位数,可以使用递归来解决。
我们可以将问题分解成两部分。
首先判断这个整数是否为0,如
果是,它的位数是0。
否则,我们可以递归地计算它除以10的位数,
并将结果加1,以包含对当前数字的计数。
这个过程可以一直进行下去,直到整数变成0。
用中文表述的递归求位数算法如下:
1. 如果整数为0,位数为0。
2. 如果整数不为0,将其除以10并递归地计算位数,将结果加1作为当前数字的贡献。
3. 将当前数字的位数添加到递归计算的结果中,并返回结果。
这个算法可以用来计算任何整数的位数,包括正数、负数和0。
递归求解链表的最大整数
递归求解链表的最大整数1. 引言链表是一种常见的数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的引用。
在实际应用中,链表经常被用来表示一组具有顺序关系的数据。
本文旨在通过递归的方式求解链表中的最大整数。
首先,我们将介绍链表的基本概念和递归的工作原理。
然后,我们将详细讨论如何使用递归算法来求解链表的最大整数,并给出具体的代码实现。
最后,我们将分析算法的时间复杂度和空间复杂度,并讨论可能的优化方法。
2. 链表的基本概念链表是一种动态数据结构,与数组不同,链表的元素在内存中不是连续存放的。
链表可以分为单向链表、双向链表和循环链表等多种形式,其中单向链表是最简单和常见的形式。
单向链表的每个节点包含两部分信息:数据元素和指向下一个节点的引用。
链表的基本操作包括插入、删除和查找。
插入是将一个新的节点插入到链表中的指定位置,删除是将链表中的一个节点删除,查找是在链表中查找指定的数据元素。
3. 递归的工作原理递归是一种常用的算法思想,它将一个问题分解为规模更小的子问题,然后通过解决子问题来解决原始问题。
递归通常涉及两个方面的内容:递归定义和递归求解。
递归定义是指问题本身可以通过对更小规模的相同问题的求解来定义。
递归求解是指通过不断缩小问题规模,直到达到某个边界条件,然后再利用边界条件的解来求解原始问题。
递归的过程可以用一棵树形结构来表示,称为递归树。
树的根节点表示原始问题,而树的每个子节点表示一个子问题。
递归树的叶子节点对应于边界条件。
递归的求解过程就是从根节点开始,依次求解每个子问题,直到达到边界条件为止。
递归算法的关键是找到递归的边界条件和递归的递推关系。
边界条件是递归过程中的停止条件,它们对应于递归树的叶子节点。
递推关系是将原始问题转化为子问题的数学关系,它描述了问题的规模如何缩小。
4. 求解链表的最大整数的递归算法在本节中,我们将详细讨论如何使用递归算法来求解链表中的最大整数。
递归计算方法
递归计算方法嘿,朋友们!今天咱来聊聊递归计算方法。
这玩意儿啊,就像是一个神奇的魔法盒子,打开之后能让你看到一连串奇妙的数字变化。
递归,听着是不是有点玄乎?其实啊,你可以把它想象成俄罗斯套娃。
一个套一个,不断地重复相同的模式。
比如说,你计算一个问题,然后这个问题又会引发一系列类似的小问题,这些小问题又用同样的方法去解决,一层一层,就这么不断深入下去。
举个例子吧,就好像你要爬一座很高很高的山。
你先迈出第一步,到了一个小平台,然后从这个小平台出发,又可以迈出下一步,到达另一个稍高一点的平台。
就这样,不断地重复这个过程,你就慢慢爬到山顶啦!递归计算方法不也是这样嘛,从一个简单的情况开始,然后不断深入,解决一个又一个相关的小问题。
你说这递归计算方法难不难?嘿,这可不好说!有时候就像解开一个复杂的谜题,需要你仔细琢磨,找到那个关键的线索。
但一旦你找到了那个点,哇塞,就像打通了任督二脉一样,一切都变得清晰起来。
咱再想想啊,生活中不也有很多类似递归的情况嘛。
就好比你学一项新技能,从最基础的开始,学会了之后再去攻克更难的部分,这不就是一种递归嘛。
还有啊,做一件大事,不也是把它分成一个个小步骤,一个一个地去完成嘛。
递归计算方法就像是一个隐藏在数字世界里的秘密通道,带你走向那些意想不到的奇妙之处。
它可以让看似复杂无比的问题,通过不断地分解和重复,变得简单易懂。
你可别小瞧了它哟!在很多领域,递归计算方法都发挥着巨大的作用呢。
比如在计算机科学里,它能帮助程序员们写出高效简洁的代码;在数学领域,它能解开很多复杂的难题。
所以啊,朋友们,当你们遇到一个看似很难的计算问题时,不妨想想递归计算方法呀。
说不定,它就能像一把神奇的钥匙,打开那扇通往答案的大门呢!总之,递归计算方法是个很有趣也很有用的东西。
它就像数字世界里的小精灵,蹦蹦跳跳地给我们带来惊喜和启发。
大家可得好好去了解了解它,感受感受它的魅力呀!。
c语言递归求数列
c语言递归求数列C语言递归求解数列是一种常见的编程问题,它可以通过递归函数来实现。
在数学中,数列是按照一定规律排列的一组数。
我们可以通过递归的方式来求解数列中的某一项或者整个数列。
首先,我们需要确定数列的规律,也就是递推关系。
递推关系是指数列中的每一项与前面的项之间的关系。
例如,斐波那契数列的递推关系是每一项等于前两项之和。
在C语言中,我们可以通过编写递归函数来实现数列的求解。
递归函数是指在函数体内调用自身的函数。
我们可以将递归函数看作是一个问题的解决方案,每次调用函数都是在解决一个更小规模的子问题。
下面是一个示例,演示了如何使用递归函数来求解斐波那契数列的第n项:```c#include<stdio.h>int fibonacci(int n) {// 递归终止条件if (n <= 1) {return n;}// 递归调用return fibonacci(n-1) + fibonacci(n-2);}int main() {int n;printf("请输入要求解的斐波那契数列的项数:");scanf("%d", &n);printf("斐波那契数列的第%d项为:%d\n", n,fibonacci(n));return 0;}```在上述代码中,我们定义了一个名为`fibonacci`的递归函数,它接受一个整数参数n,表示要求解的斐波那契数列的项数。
在递归函数内部,我们首先检查递归终止条件,即当n小于等于1时,直接返回n。
然后,我们通过递归调用函数本身来计算前两项的和,并返回结果。
在`main`函数中,我们首先获取用户输入的斐波那契数列的项数n,然后调用`fibonacci`函数来求解第n项,并将结果打印出来。
需要注意的是,递归函数在处理大规模问题时可能会导致性能问题,因为每次调用函数都需要保存现场和恢复现场。
递归与迭代对计算的意义
递归与迭代对计算的意义递归与迭代,这俩概念在计算里就像两把神奇的钥匙,能打开很多复杂问题的大门。
咱先说说递归。
递归就像是俄罗斯套娃,一个套着一个,层层嵌套。
在计算里,递归是指在函数的定义中使用函数自身的方法。
比如说,计算阶乘。
阶乘是啥呢?5的阶乘就是5×4×3×2×1。
用递归的思想来计算阶乘,就像是一个自我重复的过程。
你想算n的阶乘,那就得先算(n - 1)的阶乘,然后再乘以n。
这就好像你要打开最里面的那个俄罗斯套娃,就得先把外面的一个个打开。
递归让复杂的计算变得有规律可循。
它就像一个聪明的小工匠,知道怎么把大问题分解成一个个相似的小问题。
再看看迭代。
迭代就像是爬楼梯,一步一步往上走。
在计算中,迭代是通过不断重复一个过程来逼近结果。
比如说,求一个数的平方根。
你可以先猜一个大概的数,然后根据这个数不断调整,一步一步地接近真正的平方根。
这就好比你在爬楼梯,每一步都离目标更近一点。
迭代的好处是简单直接,就像一个踏实的行者,一步一个脚印地朝着目标前进。
递归和迭代在很多情况下都能解决相同的问题,可它们的思路又不太一样。
这就好比去一个地方,递归像是坐过山车,在复杂的轨道里穿梭,充满了层层嵌套的刺激;而迭代就像是骑自行车,稳稳当当,一步一步地向前。
递归有时候会让程序看起来简洁又优雅。
就像一个武林高手,一招一式都很精炼。
但是呢,递归如果处理不好,就可能陷入无限循环,就像一个人在迷宫里不停地打转。
这时候,就需要小心地设置好终止条件,就像在迷宫里找到出口的标记一样。
迭代虽然看起来没有递归那么高深莫测,可它的稳定性很高。
它就像一个可靠的老朋友,不会突然给你搞出什么大麻烦。
在处理一些大数据量的问题时,迭代的效率往往很高。
比如说,你要统计一个巨大文件里某个字符出现的次数。
用迭代的方法,你就可以一个字符一个字符地去看,每看到一次目标字符就做个记录。
这就像你在数一大把豆子里有多少颗红豆一样,一颗一颗地数,虽然简单,但是很有效。
C用递归求数组中的最大数和最小数
递归算法是每个学编程的人都要熟悉的算法,递归其实很简单,递归就是函数不断调用自身的过程。
通过不断的调用自身,把问题规模为n的问题,分解为问题规模更小的问题,通过参数的调用传递,可以把调用函数的值传递下去,通过问题的一步一步解的到原问题的解。
要确定一个递归算法,首先要确定递归表达式,如n的阶乘可以写成n!=n*(n-1)!,有了递归表达式,写递归算法就容易多了。
函数可写成:i nt fa ce(in t t){if(t<1)retur n 1;elseretu rn t*facet(t-1);}如,当n=5时,调用5*(5-1)!,即5*4!,之后再调用5*4*(4-1)!,即5*4*3!之后再调用5*4*3(3-1)!,即5*4*3*2!之后再调用5*4*3*2*(2-1)!,即5*4*3*2*1!最后得出5!,具体就是这样子,这里我就不再做过多的说明,下面我们看一个示例。
示例-C++用递归求数组中的最大数和最小数具体操作步骤如下:(1)新建Wi n32Ap plict ion,工程名为eg_1_fi rstmi c。
(2)在工程主文件中编写代码如下。
#inc lude<iostr eam.h>int max1=0;i nt mi n1=0;intmax(i nt a[],int n){if(a[n]>max1)m ax1=a[n];if(n==0) ret urn m ax1;elsema x(a,n-1);}int min(int *a,int n){if(a[n]<max1)m ax1=a[n];if(n==0) ret urn m ax1;elsemi n(a,n-1);}vo id ma in(){int a[10]={6,8,60,9,2,4,8,2,1,5};intn=10;cout<<"最大值是:"<<max(a,n-1)<<en dl; c out<<"最小值是:"<<m in(a,n-1)<<endl; }(3)编译运行程序,查看输出结果。
使用递归法计算自然数各位数字之和。
使用递归法计算自然数各位数字之和。
一、引言
递归法是一种在数学计算中非常有效且普遍使用的方法。
它可以实现复杂的任务,它在有限的计算步骤中求解复杂的问题。
本文将介绍如何使用递归法计算自然数各位数字之和。
二、原理
计算自然数各位数字之和,可以使用递归法。
具体的,递归函数定义如下:
sum(n) = (n mod 10) + sum (n/10),
其中n为正整数,n mod 10表示n取余10的值,sum(n/10)表示计算n/10的各位数字之和。
计算 n 各位数之和的算法如下:
(1)如果n 被 10 整除,则直接返回 0;
(2)否则,计算 n mod 10 得到的余数,再计算 n/10 的各位数字之和 summ = sum( n/10);
(3)返回 summ + (n mod 10) 的值。
三、实现
在 Java 语言中,可以使用以下函数实现:
public static int sumDigits(int n) {
if (n == 0) return 0;
return (n % 10 ) + sumDigits (n/10);
}
四、结论
本文介绍了如何使用递归法计算自然数各位数字之和的方法,同时给出了 Java 语言的实现。
通过使用递归法,可以在有限的计算步骤中求解复杂的问题,而不需要直接使用循环等复杂的算法。
c语言递归求和
c语言递归求和C语言是一种广泛应用于计算机编程的高级编程语言,它具有简洁、高效的特点。
在C语言中,递归是一种重要的编程技巧,它可以简化问题的解决过程。
本文将介绍如何使用递归来求解一个数列的和。
在数学中,数列是一组按照一定规律排列的数。
我们可以通过递归的方式来求解数列的和。
假设我们要求解的数列是1, 2, 3, 4, 5...,即从1开始,每个数比前一个数大1。
我们可以定义一个递归函数来求解这个数列的和。
首先,我们需要定义一个递归函数,命名为sum,该函数接受一个整数参数n,表示数列的第n项。
函数的返回值是数列的前n项和。
接下来,我们需要定义递归函数的终止条件。
当n等于1时,数列的第一项为1,此时函数应返回1。
然后,我们需要定义递归函数的递推关系。
当n大于1时,数列的第n项为n,我们可以通过调用sum函数来求解数列的前n-1项和,然后将结果与n相加,即可得到数列的前n项和。
下面是使用C语言编写的递归求和的代码:```c#include <stdio.h>int sum(int n) {if (n == 1) {return 1;} else {return n + sum(n - 1);}}int main() {int n;printf("请输入一个正整数:");scanf("%d", &n);printf("数列的前%d项和为:%d\n", n, sum(n));return 0;}```在上述代码中,我们首先定义了一个sum函数,该函数接受一个整数参数n,并返回数列的前n项和。
在main函数中,我们通过调用sum函数来求解数列的和,并将结果输出到屏幕上。
当我们运行上述代码并输入一个正整数时,程序会递归地计算数列的和,并将结果输出到屏幕上。
例如,当我们输入5时,程序会计算1+2+3+4+5的结果,并输出15。
通过递归求和的方法,我们可以方便地求解各种数列的和。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
利用递归思想解决计数问题
福建省永定第一中学 简绍煌
我们常会遇到一些看似排列组合应用题的计数问题,但其复杂的情形有时令人无从下手,若是利用递归思想建立递归方程加以求解,则往往能够迎刃而解.
【例1】有一楼梯共10级,如果规定每步只能跨上一级或二级,要上10级,共有多少种走法?
解 设上n 级楼梯共有n a 种走法,当1n =时,11a =;当2n =时,22a =.
当有(2)n n >级楼梯时,其走法分两类.
第一类:走完前面1n -级楼梯有1n a -种走法,走第n 级只有1种走法;
第二类:走完前面2n -级楼梯有2n a -种走法,走第1n -级与第n 级楼梯时一步走,也是1种走法.
由分类计数原理,知n 级楼梯的走法为21(2)n n n a a a n N n --=+∈>且,.
由此可以算出1089a =.
点评 其通项公式可用换元法转化为一阶线性递归数列求解.
令11n n n c a x a +=-,使数列{}n c 是以2x 为公比的等比数列(12x x 、待定).
即211211()n n n n a x a x a x a +++-=-,∴212112()n n n a x x a x x a ++=+-.对照已给递归式,
有12121
1x x x x +==-,,即12x x 、是方程210x x --=的两个根.
从而121211112222x x x x +=
===
∴211111(222n n n n a a a a +++-=-) ①
或211111(222n n n n a a a +++-=-) ②
由式①得1
1131(222n n n a a -++-=;
由式②得1
1131(222
n n n a a -++--=.
消去
1n a +,得11n n n a --⎤
=⎥⎦
. 【例2】将数字123n ,,,,填入标号为123n ,,,,的n 个方格内,每格一个数字,则
标号与所填数字均不同的填法共有多少种? 解 设这n 个自然数的错排数为n a .
当1n =时,10a =;当2n =时,21a =.
当3n ≥时,n 个自然数的错排数可以分两类情况计算.
第一类:自然数(11)k k n ≤≤-与n 互换,这时错排数为2n a -;
第二类:自然数n 在第k 位上,但自然数不在第n 位上.这时就把第n 位看做第k 位,相当于将n 以外的1n -个自然数进行错排,错排数为1n a -.
所以,自然数n 在第k 位上的错排数共有21n n a a --+种,由于k 可以是121n - ,,,共
1n -种可能,故n 个自然数的错排数为21(1)()(3)n n n a n a a n --=-+≥.①
由①式得,112[(1)]n n n n a a a n a ----=---,∴112
(1)[]!!!!
n n n n a na a n a n n n n -----=--,
即
1121[]!(1)!(1)!(2)!
n n n n a a a
a n n n n n ----=-----. 用累乘法得2111
(1)(1)!(1)!!!n n n n a a n n n n ---=-=--;
再用累加法得21111
(1)!2!3!4!!n n a n n -=-+-+- ,
故!!!!
(1)2!3!4!!n n n n n n a n =-+-+-
234(2)!(3)!(4)!(1)n n n n n n C n C n C n C =---+--+- .②
利用此递推式,可以计算1993年的一道高考试题:
同室四个各写一张贺年卡,先集中起来,然后每人从中拿一张别人送出的贺年卡,则四张贺年卡不同的分配方式有几种?
解 10a =,21a =,3122()2a a a =+=,4233()9a a a =+=.所以,四张贺年卡不同的分配方式有9种.或直接用公式②计算.
【例3】有三根杆子A ,B ,C .A 杆上有64个穿孔圆盘,盘的尺寸由下往上依次变小.要求按下列规则将所有圆盘移至C 杆:1. 每次只能移动一个圆盘;2. 大盘不能叠在小盘上面.问最少要移动多少次?
解 设最少需要移动的次数为n a .我们这样来操作: 最底下的一个圆盘先不动它,把上面余下1n -个圆盘按规则移至B 杆(其移动次数为1n a -),然后把最底下的那个圆盘移至C 杆,最后再把1n -个圆盘转移到C 杆.这样,总共移动的次数为121(2)n n a a n -=+≥.下面我们求它的通项公式.
方法1(转化为1()n n a p q a p ++=+型递归数列).显然,11a =.
∵121(2)n n a a n -=+≥,∴112(1)(2)n n a a n -+=+≥.又112a +=,故数列{1}n a +是首项为2,公比为2的等比数列.∴12n
n a +=,即21n n a =-.故64
6421a =-(次).
方法2.转化为211()n n n n a a q a a +++-=-型递推数列. ∵121(2)n n a a n -=+≥, ① ∴121n n a a +=+. ②
②-①,得112()(2)n n n n a a a a n +--=-≥,故1{}n n a a +-是首项为212a a -=,
公比为2的等比数列,即1
1222n n n n a a -+-==
,再用累加法得21n n a =-.
方法3(用迭代法).
21221
2
3
1212(21)12212
2
2
2121n n n n n n n n
a a a a a ------=+=++=++==+++++=- .
此外,此题也可用归纳猜想法求之,但要用数学归纳法证明.
点评 这是著名的汉诺塔问题(又称河内塔问题).据说创世紀时Benares 有一座波罗教塔,是由三支钻石棒(Pag )所支撑,开始时神在第一根棒上放置64个由上至下依由小至大排列的金盘(Disc ),並命令僧侣将所有的金盘从第一根石棒移至第三根石棒,且搬运过程中遵守大盘子在小盘子之下的原则,若每日仅搬一个盘子,则当盘子全数搬运完毕之时,此塔将损毁,而也就是世界末日來临之时.
根据上面的结果,如果一秒钟能移动一块圆盘,仍将需5845.54亿年.目前按照宇宙大爆炸理论的推测,宇宙的年龄仅为137亿年.
【例4】四个人互相传球,由甲开始发球,这称为第一次传球,经过5次转球后,球仍然回到甲手中,试求所有不同的传球方式有多少种?
解 设第n 次传球时球仍然回到甲手中的不同方式共有n a 种,显然,10a =.第
1(2)n n -≥次传球时共有13n -种,而只有当球不在甲手中时才有可能传给甲,所以有
113n n n a a --=-.①
将①式化为111(1)(2)333n n n n a a n --=--≥,② 令3n n n a b =,则11
(1)3n
n b b -=--.③ 设11()3n n b b λλ--=--,比较系数,可得14λ=,则1111
()(2)434
n n b b n --=--≥.
所以,14n b ⎧
⎫-⎨⎬⎩⎭是以首项为14-,公比为13-的等比数列,
于是,1111()443n n b --=-- ,即1111
()434n n b -=--+ ,
故31(1)3(2)44
n n
n a n =-+≥ .③
当1n =时,由③式可得10a =,所以,31(1)3(*)44
n n n a n N =-+∈ . 当5n =时,有5531(1)36044n a =-+= .故所有不同的传球方式有60种. 点评 λ 亦可有方程1
(9)3
x x =--(不动点)直接求得.此传球问题是染色问题的一
个特例.传球次数对应为多边形的边数,人的个数对应为使用颜色的种数,球不传给自己对应为多边形相邻点染不同颜色,球每次只传到一个人手里对应为每个点只染一种颜色,指定从甲发球相当于给甲染确定的颜色.一般地,用(3)m m ≥种颜色给(3)n n ≥边形染色,要求每一个顶点染上一种颜色,且同一条棱上的两端异色,若其不同的染法为n a ,则
3(1)(2)a m m m =--,当4n ≥时,有递推式11(1)m n n a a m m --+=-,其通项公式为(1)(2)3(1)(1)(1)4n n n
m m m n a m m n --=⎧=⎨--+-≥⎩,,,.。