递推和递归作业

合集下载

递推和递归作业

递推和递归作业

题1:编码(encode.???)【问题描述】编码工作常被运用于密文或压缩传输。

这里我们用一种最简单的编码方式进行编码:把一些有规律的单词编成数字。

字母表中共有26个字母{a,b,……,z},这些特殊的单词长度不超过6且字母按升序排列。

把所有这样的单词放在一起,按字典顺序排列,一个单词的编码就对应着它在字典中的位置。

例如:a --> 1b --> 2z --> 26ab --> 27ac --> 28你的任务就是对于所给的单词,求出它的编码。

【输入格式】仅一行,被编码的单词。

【输出格式】仅一行,对应的编码。

如果单词不在字母表中,输出0。

【输入样例】ab【输出样例】27题2:特殊的子集(subset.???)【问题描述】集合M={1,2,3,……n}的子集中,有一些是不含相邻自然数元素的。

例如:n=4时,集合{1,3}是满足要求的,而{1,3,4}是不满足的,因为它含有相邻自然数3和4。

把所有满足要求的子集记作S i,对于每一个S i计算出它的所有元素的乘积T i,求∑T i2。

【输入格式】仅一行,包括一个正整数n(n≤100)【输出格式】仅一行,即T i的平方和,可能会超出长整型范围。

【输入样例】4【输出格式】119题3:素数环(prime.???)【问题描述】给定一个n,求1..n组成的环,使得环上相邻的元素和为素数。

【输入格式】n(1<=n<=10)【输出格式】把1放在第一位置,按照字典顺序不重复的输出所有解(顺时针,逆时针算不同的两种),相邻两数之间严格用一个整数隔开,每一行的末尾不能有多余的空格。

【输入样例】8【输出样例】1 2 3 8 5 6 7 41 2 5 8 3 4 7 61 4 7 6 5 8 3 21 6 7 4 3 8 5 2题4:火力网(fire.???)【问题描述】在一个n*n的阵地中,有若干炮火不可摧毁的石墙,现在要在这个阵地中的空地上布置一些碉堡。

递规与递推习题汇总

递规与递推习题汇总

递规与递推习题汇总2.1 遍历问题我们都很熟悉二叉树的前序、中序、后序遍历,在数据结构中常提出这样的问题:已知一棵二叉树的前序和中序遍历,求它的后序遍历,相应的,已知一棵二叉树的后序遍历和中序遍历序列你也能求出它的前序遍历。

然而给定一棵二叉树的前序和后序遍历,你却不能确定其中序遍历序列,考虑如下图中的几棵二叉树:a a a a/ / \ \b b b b/ \ / \c c c c所有这些二叉树都有着相同的前序遍历和后序遍历,但中序遍历却不相同。

【输入】输A数据共两行,第一行表示该二叉树的前序遍历结果s1,第二行表示该二叉树的后序遍历结果s2。

【输出】输出可能的中序遍历序列的总数,结果不超过长整型数。

【样例】trave1.in trave1.outabc 4bca【算法分析】根据二叉树先序遍历和后序遍历的特点,可以知道,先序遍历的第一个结点是后序遍历的最后一个结点,对于中序遍历来说却是中间的一个结点,这里所说的中间也只是相对而言的中间。

如果一棵二叉树的根结点没有左子树,那么先序遍历的第一个结点也是中序遍历的第一个结点,如果一棵二叉树的根结点没有右子树,那么先序遍历的第一个结点是中序遍历的最后一个结点。

我们这里还认为就是中序遍历的中间结点,上面两种情况只是特殊的情况。

设二叉树的结点总数为n(对于输入的字符串来说是它的长度),对于先序遍历的结果,第一个结点为根结点,从第二个结点到最后一个结点分为n种情况:根结点的左子树结点个数为n-1,右子树结点的个数为0;根结点的左子树结点个数为n-2,右子树结点的个数为1;……根结点的左子树结点个数为n-i,右子树结点的个数为i-1;{0<=i<=n-1);……根结点的左子树结点个数为0,右子树结点的个数为n-1。

根据这n种情况,分别将二叉树拆分为左子树和右子树,左子树结点个数为n-i,右子树结点的个数为i-l(0<=i<=n-1),先序遍历的结果是从第二个结点(字符)开始取,而后序遍历的结果里是从第1个结点字符开始取。

关于递归与递推的那七道题

关于递归与递推的那七道题

关于递归与递推的那七道题递归与递推是动态规划最底层的东西,掌握好它对于彻底的理解动规是至关重要的,这次做的题不难,但是它很能锻练人的思维,每一道题都有多种解法。

只要静下心来想,一般人都能做出来,而在做题的过程中,你会有很大的收获。

1、一只小蜜蜂...题目是这样的,有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。

请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。

对于这种题目,我们首先得找出蜂房之间的关系,如从1只能走到2和3,从2只能走到3和4,从3只能走到4和5……,因此我们可以得到它们的递推关系:f[a] = f[a+1]+f[a+2];下面我们再来找出口,把这个问题化简,即当a与b相邻时(a+1=b 或a+2=b),f[a] = 1,所以这个问题可以解决了。

它就是一个递归,遇到b就结束。

为了减少重复访问,我们可以用记忆化搜索来提高效率。

这个题也可以顺着来推,即从a到a有0条路线,从a到a+1有1条路线,从a 到a+2有1条路线,而a+3的路线条数来源于a+1和a+2的路径条数。

f[a] = 0;f[a+1] = 1;f[a+2] = 1;f[a+3] = f[a+1]+f[a+2];……f[b] = f[b-1]+f[b-2];由上面的式子就可以看出,它就是一个菲波拉契数列。

2、LELE的RPG难题题目描述:有排成一行的n个方格,用红(Red)、粉(Pink)、绿(Green)三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色.求全部的满足要求的涂法.以上就是著名的RPG难题.解法一:这个题目经过同学们的讨论,得出了三种解法。

我所用的方法还是搜索,我们先不考虑它的限制条件,把第一个格子看成是树的根,那么总共可以建成三棵树,每一棵树的结点都有三个孩子。

我们的目标就是要统计这三棵树中分别从根结点走到叶子结点的总的路径条数。

然后把限制条件加上,把不符合要求的路径去掉,即可得出最终的结果。

关于递归的一些小练习

关于递归的一些小练习

关于递归的⼀些⼩练习递归什么是递归在程序中, 所谓的递归, 就是函数⾃⼰直接或间接的调⽤⾃⼰.1. 直接调⽤⾃⼰2. 间接调⽤⾃⼰就递归⽽⾔最重要的就是跳出结构. 因为跳出了才可以有结果.所谓的递归就是化归思想递归的调⽤, 写递归函数, 最终还是要转换为⾃⼰这个函数.假如有⼀个函数 f, 如果它是递归函数的话, 那么也就是说函数体内的问题还是转换为 f 的形式.递归思想就是将⼀个问题转换为⼀个已解决的问题来实现function f() {... f( ... ) ...}例⼦: 1, 2, 3, 4, 5, ..., 1001. ⾸先假定递归函数已经写好, 假设是 foo. 即 foo( 100 ) 就是求 1 到 100 的和2. 寻找递推关系. 就是 n 与 n-1, 或 n-2 之间的关系: foo( n ) == n + foo( n - 1 )var res = foo( 100 );var res = foo( 99 ) + 100;3. 将递推结构转换为递归体function foo( n ) {return n + foo( n - 1 );}* 将求 100 转换为求 99* 将求 99 转换为求 98* ...* 将求 2 转换为求 1* 求 1 结果就是 1* 即: foo( 1 ) 是 14. 将临界条件加到递归体中function foo( n ) {if ( n == 1 ) return 1;return n + foo( n - 1 );}练习: 求 1, 3, 5, 7, 9, ... 第 n 项的结果与前 n 项和. 序号从 0 开始求第 n 项的1. ⾸先假定递归函数已经写好, 假设是 fn. 那么第 n 项就是 fn( n )2. 找递推关系: fn( n ) == f( n - 1 ) + 23. 递归体function fn( n ) {return fn( n-1 ) + 2;}4. 找临界条件求 n -> n-1求 n-1 -> n-2...求 1 -> 0求第 0 项, 就是 15. 加⼊临界条件function fn( n ) {if ( n == 0 ) return 1;return fn( n-1 ) + 2;}前n项和1. 假设已完成, sum( n ) 就是前 n 项和2. 找递推关系: 前 n 项和等于第 n 项 + 前 n-1 项的和3. 得到递归体function sum( n ) {return fn( n ) + sum( n - 1 );}4. 找临界条件n == 1 结果为 15. 得到递归函数function sum( n ) {if ( n == 0 ) return 1;return fn( n ) + sum( n - 1 );}练习: 2, 4, 6, 8, 10 第 n 项与前 n 项和第n项function fn( n ) {if ( n == 0 ) return 2;return fn( n-1 ) + 2;}前n项和function sum( n ) {if ( n == 0 ) return 2;return sum( n - 1 ) + fn( n );}练习: 数列: 1, 1, 2, 4, 7, 11, 16, … 求第 n 项, 求前 n 项和.求第 n 项1. 假设已经得到结果 fn, fn( 10 ) 就是第 10 项2. 找递推关系0, 1 => fn( 0 ) + 0 = fn( 1 )1, 2 => fn( 1 ) + 1 = fn( 2 )2, 3 => fn( 2 ) + 2 = fn( 3 )...n-1, n => fn( n-1 ) + n - 1 = fn( n )3. 递归体也就清楚了, 临界条件是 n == 0 => 1function fn( n ) {if ( n == 0 ) return 1;return fn( n-1 ) + n - 1;}如果从 1 开始表⽰, 那么第 n 项为1. 假设已经得到结果 fn, fn( 10 ) 就是第 10 项2. 找递推关系1, 2 => fn( 1 ) + 0 = fn( 2 )2, 3 => fn( 2 ) + 1 = fn( 3 )3, 4 => fn( 3 ) + 2 = fn( 4 )...n-1, n => fn( n-1 ) + n - 2 = fn( n )3. 临界条件 n == 1 => 1前n项和function sum( n ) {if ( n == 0 ) return 1;return sum( n - 1 ) + fn( n );}如果从 0 开始0 1 2 3 4 5 61, 1, 2, 4, 7, 11, 16,如果从 1 开始1 2 3 4 5 6 71, 1, 2, 4, 7, 11, 16,练习: Fibonacci 数列: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, …求其第 n 项.递推关系 fn(n) == fn( n- 1) + fn( n - 2)function fib( n ) {if ( n == 0 || n == 1 ) return 1;return fib( n - 1 ) + fib( n - 2 );}阶乘阶乘是⼀个运算, ⼀个数字的阶乘表⽰的是从 1 开始累乘到这个数字. 例如 3! 表⽰1 * 2 * 3. 5! 就是1 * 2 * 3 * 4 * 5. 规定 0 没有阶乘, 阶乘从 1 开始.求 n 的阶乘function foo ( n ) {if ( n == 1 ) return 1;return foo( n - 1 ) * n;}求幂求幂就是求某⼀个数⼏次⽅2*2 2 的平⽅, 2 的 2 次⽅求 n 的 m 次⽅最终要得到⼀个函数 power( n, m )n 的 m 次⽅就是 m 个 n 相乘即 n 乘以 (m-1) 个 n 相乘function power ( n, m ) {if ( m == 1 ) return n;return power( n, m - 1 ) * n;}深拷贝如果要实现深拷贝那么就需要考虑将对象的属性, 与属性的属性, ... 都拷贝过来如果要实现:1. 假设已经实现 clone( o1, o2 ), 将对象 o2 的成员拷贝⼀份交给 o12. 简单的算法, 将 o2 的属性拷贝到 o1 中去function clone( o1, o2 ) {for ( var k in o2 ) {o1[ k ] = o2[ k ];}}3. 找递推关系, 或叫划归为已经解决的问题假设⽅法已经实现, 问⼀下, 如果 o2[ k ] 是对象继续使⽤这个⽅法因此需要考虑的是 o2[ k ] 如果是引⽤类型, 再使⽤⼀次 clone() 函数如果 o2[ k ]不是引⽤类型, 那么就直接赋值function clone( o1, o2 ) {for ( var k in o2 ) {if ( typeof o2[ k ] == 'object' ) {o1[ k ] = {};clone( o1[ k ] , o2[ k ] );} else {o1[ k ] = o2[ k ];}}}复杂实现: clone( o ) -> newObjfunction clone( o ) {var temp = {};for ( var k in o ) {if ( typeof o[ k ] == 'object' ) {temp[ k ] = clone( o[ k ] );} else {temp[ k ] = o[ k ];}}return temp;}请⽤递归实现 getElementsByClassName<div><div>1<div class="c">2</div><div>3</div></div><div class="c">4</div><div>5<div>6</div><div class="c">7</div></div><div>8</div></div>1. 如果实现⼀个⽅法 byClass( node, 'c', list ), 表⽰在某⼀个节点上查找符合 class 属性为 c 的元素2. 在当前元素的⼦元素中查找, 如果有符合要求的, 存储到⼀个数组中3. ⾸先遍历⼦节点, 然后看⼦节点是否还有⼦节点, 如果没有直接判断, 如果有再递归function byClass( node, className, list ) {var arr = node.childNodes;for ( var i = 0; i < arr.length; i++ ) {if ( arr[ i ].className == className ) {list.push( arr[ i ] );}if ( arr[ i ].childNodes.length > 0 ) {byClass( arr[ i ], className, list );}}}。

递归递推区别分析与例题总结

递归递推区别分析与例题总结

递归递推区别分析与例题总结递归与递推⽂章⽬录特点递归(recursive)运⾏过程中⾃我调⽤,求解过程分为回溯和递推两个过程,占⽤内存多(栈数先积累后收缩,有可能爆栈),代码简洁但低效。

尾递归和递归区别⬇function story() {从前有座⼭,⼭上有座庙,庙⾥有个⽼和尚,⼀天⽼和尚对⼩和尚讲故事:story() // 尾递归,进⼊下⼀个函数不再需要上⼀个函数的环境了,得出结果以后直接返回。

}function story() {从前有座⼭,⼭上有座庙,庙⾥有个⽼和尚,⼀天⽼和尚对⼩和尚讲故事:story(),⼩和尚听了,找了块⾖腐撞死了 // ⾮尾递归,下⼀个函数结束以后此函数还有后续,所以必须保存本⾝的环境以供处理返回值。

}尾递归省内存、⾼效(相当于(或者说递推?))Python⽆法在语⾔中实现尾递归优化(Tail Call Optimization, TCO),所以采⽤了for, while等特殊结构代替recursive的表述(优化是编译器⼲的,发现尾递归结构就给优化了)。

递推(iterative)效率⽐递归⾼,尽量递推,除⾮只能递归。

例题递推例⼦⼀般都是数学题。

重点是找递推公式(也太好偷懒了吧)平⾯分割问题直线分割平⾯(基本结论)如果当前有 n 条直线,新增加⼀条直线(第 n+1 条直线),可以多出来 n 个交点(新的直线和之前所有的直线都有交点),⽽多出来 n 个交点对应到可以多出 n+1 个平⾯(⽐如从两条线,⼜新增⼀条线时,新的线和两条线都相交,作⽤在三个区域上,对这三个区域切分,增加三个平⾯)。

也即:S n+1=S n+(n+1)=1+(n+1)(n+2)2当平⾯上已有n-1条曲线将平⾯分割成a n-1个区域后,第n-1条曲线每与曲线相交⼀次,就会增加⼀个区域,因为平⾯上已有了n-1条封闭曲线,且第n条曲线与已有的每⼀条闭曲线恰好相交于两点,且不会与任两条曲线交于同⼀点,故平⾯上⼀共增加2(n-1)个区域,加上已有的a n-1个区域,⼀共有a n-1+2(n-1)个区域。

计算机常用算法

计算机常用算法

2.3 递归法
例2-14:找出从自然数1,2,3,4……n中任取 (r<=n)个数的所 :找出从自然数 中任取r( ) 中任取 有组合
例2-15:用互递归法计算正弦和余弦函数。 :用互递归法计算正弦和余弦函数。 有关公式: 有关公式: Sin 2Ө = 2 SinӨ CosӨ Cos 2Ө = 1- 2(SinӨ)2 有关泰勒展开式: 有关泰勒展开式: Sin x = x – x3/6 Cos x = 1-x2/2 上述展开式在x很小时是很接近实际值的 但在x相对较大时 很小时是很接近实际值的。 上述展开式在 很小时是很接近实际值的。但在 相对较大时 误差很大。故通过对|x|的判断 决定使用哪种计算公式。 的判断, 误差很大。故通过对 的判断,决定使用哪种计算公式。
2.1 递推与迭代
递推与迭代的设计要素: 递推与迭代的设计要素: 迭代(或递推)表达式。 ① 迭代(或递推)表达式。 迭代(或递推)变量设计。 ② 迭代(或递推)变量设计。 迭代(或递推)初始值的选择。 ③ 迭代(或递推)初始值的选择。 迭代(或递推)终止(收敛)条件。 ④ 迭代(或递推)终止(收敛)条件。 迭代的收敛: 迭代的收敛: 如方程无解,迭代算法求出的近似值序列就不会收敛, ① 如方程无解,迭代算法求出的近似值序列就不会收敛,从 程序角度会出现“死循环”现象。 程序角度会出现“死循环”现象。 ② 方程虽然有解,但迭代公式选择不当或迭代初始近似值选 方程虽然有解, 择不合理,也会导致迭代不收敛。 择不合理,也会导致迭代不收敛。
拉菲森newton-Laphson法)求 例2-08:用切线法(牛顿 拉菲森 :用切线法(牛顿-拉菲森 法 非病态一元n次多项式全部实根 次多项式全部实根。 非病态一元 次多项式全部实根。
2.1 递推与迭代(作业与上机) 递推与迭代(作业与上机)

递推与递归练习题

递推与递归练习题
pointer=pointer-> next;
}
getch();
}
3.#include <stdio.h>
#include <stdlib.h>
#define N 30
void main()
{
int n, si,si1;
si1=1;
for(n=N-1;n>=1;n--)//倒数第二天开始
{
si=(si1+1)*2; //算出当天的桃子数
{
if(Duhe(a,b+2,0)==1)
return 1;
}
if(judge(a+2,b,1-a,3-b,0))
{
if(Duhe(a+2,b,0)==1)
return 1;
}
if(judge(a+1,b,2-a,3-b,0))
{
if(Duhe(a+1,b,0)==1)
return 1;
}
if(judge(a,b+1,3-a,2-b,0))
{ /*则判断下一个状态,直至问题解决*/
if(a==0&&b==0) return 1;
if(n==0) /*判断0状态时,商匪状态是否符合要求*/
{
if(judge(a-1,b-1,4-a,4-b,1))
{
if(Duhe(a-1,b-1,1)==1)
return 1;
}
if(judge(a,b-2,3-a,5-b,1))
2.(用递归做)商人渡河问题是这样的:有三个商人,三个强盗,和一条船(船每次只可以载小于等于两个人)他们同在河的一边,想渡过河去,但是必须保证在河的任何一边必须保证商人的数目大于等于强盗的数目,应该怎么过这条河呢?

初中数学专题4.4 递推和归纳署

初中数学专题4.4 递推和归纳署

4.4 递推和归纳署递推和归纳是处理与正整数n 相关的命题时常用的方法.其基本思想是 从小的n 推出下一个或者大的n 成立.强调前后者之间的联系.例1 已知有2n 个人,如果每两人一组,试问:有多少种不同的分组方式?【解】先取定一个人,他与其余21n -个人均可组成一组,故有21n -种方式;再考虑剩下22n -人,取定一人后,他有23n -种方式组队.依此类推,于是共有()()21231n n -⨯-⨯⨯即(21n -)!种不同的组队方式.例2 已知某台阶有10级,每次可以向上跨一级或两级台阶.试问:走完10级台阶有多少种走法?【解】不妨设走完n 级台阶有n a 种走法,则要走到第n 级,要么从第1n -级上一级,要么从第2n -级跨两级.于是可以得到递推关系式:12(n 3)n n n a a a --=+≥,而11a =,22a =,所以3123a a a =+=,4235a a a =+=,5348a a a =+=,,834a =,955a =,1089a =,故走完10级台阶有89种走法.例3 圆周上两个点将圆周分成两半,在这两点玉写上数1.然后将两段半圆弧等分土写上相邻两数之和;再把四段圆弧分别等分,仍然在分点上写上相邻两数之和.如此下去,问:第六步后,圆周上所有点之和是多少?【解】不妨设第n 步后,圆周上所有点之和为n a 考虑从第1n -步到第n 步的过程:添上去的新数都等于相邻两数之和,且原来的数都被计算了两遍,即新数之和为12n a -,所以11123n n n n a a a a ---=+=,又12a =,所以26a =,318a =,454a =,5162a =,6486a =,即第六步后,圆周上所有数字之和为486.例4 四人进行篮球训练,亙相传球.要求每人接球后马上传给别人,开始由甲开球,并作第一次传球.第五次传球后,球又回到甲手中.试问;有多少种不同的传球方式?【解】设第n 次传球后,球回到甲手中的传球方式有n a 种,考虑前1n -次传球,每次传球都有三种选择,故所有传球方式共有13n -种.注意到,只有第1n -次传球后,球不甲手上,那么第n 次才能传给甲,所以,()113.2n n n a a n --=-≥由10a =,可依次算得2133a a =-=,23236a a =-=,343621a =-=,454360a a =-=,所以共有60种可能的传球方式.【注】从上面的处理可看出只有恰当建立前后者之间的关系式才能方便地用递推方法解决.例5 n 条直线最多能把平面分成多少部分?【解】不妨设n 条直线最多能把平面分成n a 份,考虑第n 条直线,它最多与前面1n -条均相交,那么它被分成了n 段,被分成的每一条线段(或者射线),都可以将平面多分出一个部分,所以1n n a a n -=+,于是()121n n a a n --=+-,()232n n a a n --=+-,323a a =+,212a a =+,将上面1n -个式子相加,有123n a a n =++++,结合12a =,可得222232n n n a n ++=++++=,所以n 条直线最多可以将平面分成222n n ++个部分. 例6 用1或2两个数字写n 位数,其中任意相邻的两个位置不全为1.记这样的n 位数的个数为()f n .求()10f 的值.【解】符合条件的n 位数可以分为如下两类:(1)首位为2,则以后的1n -位符合条件的个数为()1f n -;(2)首位为1,则第二位必为2,之后2n -位符合条件的个数为()2f n -,于是()()()12f n f n f n =-+-.且()12f =,()23f =,所以可以递推得到()10144f =.【注】这里与例2 —样,均为斐波那契数列.例7 已知有排成一行的10个方格,现用红、黄、蓝三色涂每个格子,每格涂一色,要求任意相邻的格子不同色,且首尾两格也不同色.试问:有多少种不同的涂法?【解】直接考虑一般情形,不妨设一行n 个格子的涂法有n a 种,那么显然13a =,26a =,36a =,当4n ≥时,将格子编号,第1个格与第1n -格不相邻.(1).若第1n -格与第1格颜色不同,此时第n 格只有一种颜色可以选择,且前1n -个格子满足首尾两个不同色,故这种情况有1n a -种涂法.⑵若第1n -格与第1格颜色相同,此时第2n -格与第1格颜色不同,于是前2n -个格子满足首尾两个不同色,于是前2n -个格子有2n a -种涂法,而另一方面,第n 个格子此时有两种选择,于是这种情况有22n a -种涂法.故()1224n n n a a a n --=+≥,递推可知101022a =+.例8 空间n 个平面最多可将空间分成多少个部分?【解】显然,当这n 个平面满足以下条件时,所分割的部分数是最多的:1. 这n 个平面两两相交;2. 没有三个以上的平面交于一点;3. 这n 个平面的交线任两条都不平行.由于一般情况不易考虑,不妨从简单的、特殊的情况入手来寻找规律.设n 个平面分空间的部分数为n a ,易知:当1n =时,2n a =;当2n =时,4n a =;当3n =时,8n a =;当4n =时,情况有些复杂,我们以一个四面体为模型来观察,可知15n a =;从以上几种情况,很难找串般性的规律,而且当n 的值继续增大时,情况更复杂.那么,我们把问题再进一步简单化,将空间问题退化到平面问题:n 条直线最多可将平面分割成多少个部分?(这n 条直线中,任两条不平行,任三条不相交同一点),设n 条直线最多可将平面分割成n b 个部分,那么由例5的结论知()2122n b n n =++. 回到原问题,用类似思路来解决空间的问题.设k 个平面将空间分割成k a 个部分,再添加上第1k +个平面,这个平面与前k 个平面相交有k 条交线,这k 条交线,任意三条不共点,任意两条不平行,因此这第1k +个平面就被这k 条直线分割成k b 个部分.而这k b 个部分平面中的每一个,都把它所通过的那一部分空间分割成两个较小的空间.所以,添加上这第1k +个平面后就把原有的空间数增加k b 个部分.由此得递推关系式:1k k k a a b +=+,即1k k k a a b +-=.当1k =,2,,1n -时,我们得到如下1n -个关系式:211a a b -=,322a a b -=,11n n n a a b ---=,将这1n -个式子相加,得()1121n n a a b b b -=++++. 因为()2122n b n n =++且12a =,所以()()()()(()((){}()()()()()22222231112112222112222121211212121111561121111126266n a n n n n n n n n n n n n n n n n n ⎡⎤=+++++++-+-+⎢⎥⎣⎦⎡⎤⎡⎤=++++-+++-+-⎣⎦⎣⎦++⎡⎤=++--+-=++-+=⎢⎥⎣⎦, 综上所述,n 个平面最多可将平面分割成()31566n n ++个部分. 练习 4.41.平面上5个圆最多能把平面分成多少部分?2.设1a ,2a ,,n a 这n 个数取值为0或1.记满足12a a ≤,23a a ≥,34a a ≤,45a a ≥的序列()12,,,n a a a 个数为()f n .求()10f 的值.3.求满足以下条件的数列的个数:项数为6,每一项为0或1或2,并且0不能为2的前一项也不能为2的后一项.4.平面上有100条直线,其中20条互相平行.问这100条直线最多能将平面分成多少部分?5.已知:ABC 内部有2011个点,以顶点A 、B 、C 和这2011个点为顶点能把原三角形分割成多少个小三角形?73,36,41,x y z =⎧⎪=⎨⎪=⎩76,32,42,x y z =⎧⎪=⎨⎪=⎩79,28,43,x y z =⎧⎪=⎨⎪=⎩ 7.将五条边依次记为, ,,,.不妨设为红色,为黄色.那么若为红,则,.可以为(黄、蓝)或者(蓝、黄);若为蓝,则,可以为(红、黄)或(红、k)或(黄、蓝).所以当为红色,为黄色时,共有5种染色方法.而的染色办法还可以是(红、蓝),(黄、蓝),(黄、红),(蓝、红),(蓝、黄),且每一种情况都与上述情况是对称的.所以不同染方法共有'种.8. 分析:注意到当自变量变大时,函数值变化为,化简即为,所以若某一整数可以用以上形式表示的话,那么这个数加上6也可以用这个形式表示.所以只需枚举出1〜6中哪些数可以表示即可.令,易知.所以若整数可以表示为的形式,那么(为自然数)也可以表示为的形式.当时,;当时, ;当时,; 当时,;且. 82,24,44,x y z =⎧⎪=⎨⎪=⎩85,20,45,x y z =⎧⎪=⎨⎪=⎩a b c d e a b c d e c d e a b (),a b 6530⨯=x 12111246222x x x ⎡⎤⎡⎤⎡⎤⎛⎫⎛⎫⎛⎫+++++ ⎪ ⎪ ⎪⎢⎥⎢⎥⎢⎥⎝⎭⎝⎭⎝⎭⎣⎦⎣⎦⎣⎦[][][]2466x x x +++()[][][]246f x x x x =++()162f x f x ⎛⎫+=+ ⎪⎝⎭a ()f x 6a k +k ()f x 106x ≤<()0f x =1164x ≤<()1f x =1143x ≤<()2f x =1132x ≤<()3f x =162f ⎛⎫= ⎪⎝⎭所以1~6中,有4个数可以表示为/的形式.而,所以共有个数可以表示成的形式.练习 4.41.一个圆最多分成两个部分;两个圆最多分成四个部分;三个圆最多分成八个部分.现在考虑第四个圆.要使分成的部分尽量多,第四个圆必须与前三个都有两个交点,因此有6个交点,将第四个圆周分成6段,每段圆弧都可以增加一个部分.所以四个圆最表可以分成份.同理,五个元最多可以分成个部分•【注】事实上,用例5的方法,也可以算出个圆最多可以将平面分成的份数的情形.这里.2.显然,,,.记当时,满足条件的序列数为,当时满足条件的序列数为.则.当为奇数时,有,;当为偶数时,有,.于是可以得到为奇数时,; 当为偶数时,.故为斐波那契数列,于是.3. 考虑一般情形,记满足条件且项数为的数列个数为.其中以0为末项的数列有个,以1为末项的数列有个,以2为末项的数列有个. 于是容易发现,,.所以(因为)而,,所以()f x 20046334=⨯33441336⨯=[][][]246x x x ++8614+=14+822=n ()22122232122n a n n n =+⨯+⨯+⨯++-⨯=-+()12f =()23f =()35f =0n a =()g n 1n a =()h n ()()()f n g n h n =+n ()()1h n h n =-()()1g n f n =-n ()()1g n g n =-()()1h n f n =-n ()()()()()()()1112f n g n h n f n h n f n f n =+=-+-=-+-n ()()()()()()()1121f n g n h n g n f n f n f n =+=-+-=-+-()f n ()10144f =n n f n a n b n c n n n n f a b c =++11n n n a a b --=+111n n n n b a b c ---=++11n n n c b c --=+1220n n n f f f ----=12222n n n n n b a b c f -----=++=13f =27f =6239f =4.首先,20条平行直线将平面分成了 21份.设另外加上条直线,连同这20条,将平面最多分成个部分.考虑加上第条直线时的情况.它与前是条有个交点,所以,,,,将上述后个式子相加,有.又,所以,故.习题解答 【注】这里与前面例题不同的地方仅仅在于递推开始时初始状态稍有改变,基本方法仍然相同.5.设内部有个点时能分割成个小三角形.考虑从个点到个点的过程.(1)如果第个点在某小三角形的内部,那么将这个点与小三角形三顶点相接,一分为三,故增加了两个;(2)如果第个点在某两个小三角形的公共边上,则这两个小三角形的顶点与这个点相连,分别将它们都一分为二,故也增加了两个.于是,且,所以.当 时,,即能把原三角形分割成4023个小三角形.k k a 1k +20k +20k +121k k a a k +=++()1211k k a a k -=++-()12212k k a a k --=++-21211a a =++1k -()()112112k k k a a k -=+-+142a =21412122k a k k =++804861a =n n a 1n -n n n 12n n a a -=+01a =21n a n =+2011n =20114023a =。

简单递归例子

简单递归例子

简单递归例子
1. 嘿,你知道计算阶乘吧,那就是个简单递归例子呀!比如说,计算 5 的阶乘,不就是 5 乘以 4 的阶乘嘛,4 的阶乘又是 4 乘以 3 的阶乘,一直
这样递推下去,直到 1 的阶乘就是 1,多神奇呀!
2. 哎呀呀,斐波那契数列也是呢!前两个数是 0 和 1,后面每个数都
是前两个数的和,这就是妥妥的递归呀!你想想,像不像搭积木,一层一层搭起来的感觉。

3. 还有走迷宫!当你在一个岔路口选择一条路走下去,如果碰到死胡同,就回到岔路口再选另一条路,这也有点递归的味道啊,是不是很有意思呢?
4. 你看画树的例子呀!先画一个主干,然后从主干上再长出分支,每个分支又可以长出更小的分支,这不就是用递归在构建嘛!
5. 计算最大公约数也能用递归呢!如果两个数不相等,就把大的数变成大的数减去小的数,小的数不变,然后再去算,这不就是在反复进行一个过程嘛,多酷!
6. 就说汉诺塔问题吧!把盘子从一个柱子移动到另一个柱子,不也得靠递归的思路嘛!这就像接力赛,一环扣一环的。

7. 像倒着数数也是呀!从 10 数到 1,不就是每次减去 1 然后接着数,这也是一种简单的递归呀!
8. 你瞧,生活中好多地方都有递归的影子呢!这真的很神奇,不是吗?简单的递归例子就在我们身边呀,让我们发现更多有趣的递归吧!
我的观点结论:递归在很多地方都有体现,而且非常有趣,大家可以多多留意去发现呀。

递归递推测试题分析讲解

递归递推测试题分析讲解

3
实现中常见的问题
问题一: 问题一: 不适应递归的思路,直接分析输入的字符串, 不适应递归的思路,直接分析输入的字符串,试图自 己写进栈出栈的程序,写得逻辑复杂, 己写进栈出栈的程序,写得逻辑复杂,因考虑不周出 错。 问题二: 问题二: 不会使用atof()函数,自己处理浮点数的读入, 不会使用atof()函数,自己处理浮点数的读入,逻 atof()函数 辑复杂出错。 辑复杂出错。
10
#include <stdio.h> int W,H; char z[21][21]; int f(int x,int y){ if(x<0||x>=W)||y<0||y>=H) return 0; if(z[x][y]==‘#’) return 0; else { z[x][y]=‘#’;//将走过的瓷砖做标记 z[x][y]=‘#’;//将走过的瓷砖做标记 return 1+f(x-1,y)+f(x+1,y)+f(x,y-1)+f(x,y+1) } } void main() { int i,j,num; while(scanf(“%d%d”,&H,&W) && W!=0 && H!=0){ num=0; for(i=0;i<W;i++) scanf(“%s”,z[i]); for(i=0;i<W;i++) for(j=0;j<H;j++) if(z[i][j]==‘’@)printf(“%d\n”,f(i,j)); } }
#include <stdio.h> int count(int x,int y){ if (y==1||x==0)return 1; if (x<y) return count(x,x); return count(x,y-1)+count(x-y,y); count(x,y-1)+count(x} void main() { int t,m,n; scanf(“%d”,&t); for (int i=0;i<t;i++){ scanf(“%d%d”,&m,&n); printf(“%d\ printf(“%d\n”,count(m,n)); }

python常用算法 递推法、递归法、迭代法、二分法

python常用算法 递推法、递归法、迭代法、二分法

python常用算法递推法、递归法、迭代法、二分法Python常用算法之一:递推法递推法是一种基于已知结果推导出未知结果的算法方法。

在递推法中,我们通过已知的初始值或基础情况,以及与前一项或前几项的关系,计算出后一项的值。

递推法常常用于解决数列、数学关系、动态规划等问题。

递推法的基本思想是通过找到问题的递推关系式来求出未知项的值。

这个关系式可以是一个简单的数学公式或逻辑表达式。

为了使用递推法,我们需要先找到递推公式,并明确初始项的值。

通过逐步求解的方式,我们可以得到数列的任意项的值。

递推法的实现通常采用循环结构。

我们可以使用for循环来遍历每一项,并根据递推公式来计算后一项的值。

下面是一个简单的例子,计算斐波那契数列的第n项:pythondef fibonacci(n):if n == 0:return 0elif n == 1:return 1else:a, b = 0, 1for i in range(2, n+1):a, b = b, a + breturn b在这个例子中,我们使用了一个for循环来计算斐波那契数列的第n 项。

首先,我们定义了初始项a=0和b=1。

然后,通过循环计算每一项的值,更新a和b的值,最后返回b作为结果。

递推法的优点是简单明了,适用于不涉及递归调用的问题。

尤其对于一些数值计算的问题,递推法可以利用计算机的高效运算能力,快速求解问题。

接下来,让我们看看另一种常用的算法方法:递归法。

Python常用算法之二:递归法递归法是一种在解决问题时调用自身的方法。

在递归法中,我们将一个复杂的问题分解成一个或多个规模较小的相同问题,直到问题的规模足够小,可以直接求解为止。

递归法需要定义一个递归函数,该函数在调用过程中会不断地传递参数给自身,直到满足停止条件为止。

递归法的实现通常采用函数的递归调用。

在函数的内部,我们可以通过调用自身来解决同类的子问题,同时逐步缩小问题的规模。

递归函数中通常包含两部分:基准情况(停止条件)和递归调用。

递归与递推

递归与递推

递推与递归练习题1、过河卒(NOIP2002普及组第4题)【问题描述】棋盘上A点有一个过河卒,需要走到目标B点。

卒行走的规则:可以向下、或者向右。

同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。

因此称之为“马拦过河卒”。

棋盘用坐标表示,A点(0, 0)、B点(n, m)(n, m为不超过15的整数),同样马的位置坐标是需要给出的。

现在要求你计算出卒从A点能够到达B 点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。

输入:一行四个数据,分别表示B点坐标和马的坐标。

输出:一个数据,表示所有的路径条数。

【样例输入】knight.in6 6 3 3【样例输出】knight.out6【问题分析】跳马是一道老得不能再老的题目,每位编程者都学过,一般是在学习回溯或搜索算法时,很多书上也有类似的题目,一些比赛中也经常出现这一问题的变形(如NOIP1997初中组第三题)。

有些同学一看到这种类型的题目就去盲目搜索,但事实证明:当n,m=15就会超时。

其实,对本题稍加分析就能发现,到达棋盘上的一个点,只能从左边过来(我们称之为左点)或是从上面过来(我们称之为上点)。

根据加法原理,到达某一点的路径条数,就等于到达其相邻的上点或左点的路径数目总和。

因此我们可以使用逐列(逐行)递推的方法来求出从起点到终点的路径数目。

障碍点(马的控制点)也完全适用,只要将到达该点的路径数目设置为0即可。

假设用F[I,J]到达点(I,J)的路径数目用G[I,J]表示点(I,J)是否为对方马的控制点,G[I,J]=0表示不是对放马的控制点,G[I,J]=1表示是对方马的控制点。

则,我们可以得到如下的递推关系式:F[I,J]=0 {G[I,J]=1}F[I,0]=F[I-1,0] {I>0,G[I,0]=0}F[0,J]=F[0,J-1] {J>0,G[0,J]=0}F[I,J]=F[I-1,J]+F[I,J-1] {I>0,J>0,G[I,J]=0}上述递推式边界是:F[0,0]:=1。

递推—递归算法练习2

递推—递归算法练习2

有了棋格的状态图后,程序应能判断让谁 先走,计算机选择必胜策略或双方和(双方均 不能到达目标格)的策略下棋,这样就能保证 计算机尽可能不败。
设 1 表示必胜态, -1 表示必败态, 0 表示和 态或表示无法到达的棋格。 例如,设N=10,S={1,2},则可确定其每个棋 格的状态如下所示:
1 -1 -1 1 -1 -1 1 -1 -1 1
而N=10,S={2,3}时,其每格的状态将会如下 所示:
0 -1 -1 0 1 0 -1 -1 0 1
二、钢板分割问题
问题:设有一块正方形的钢板,现需将它分成n个小 正方形。例如,当: n=2 不可能有解。 n=3 不可能有解。 n=4 可分成4个小正方形钢板。 n=5 不可能有解。 n=6 即一个大的加五个小的。 n=7 即三个较大的加四个小的。 n=8 即一个大的加七个小的。 问题:任给n,求出分成n个小正方形的方法。
三、剔除多余括号
键盘输入一个含有括号的四则运算表达式,可能 含有多余的括号,编程整理该表达式,去掉所有多 余括号,原表达式中所有变量和运算符相对位置保 持不变,并保持原表达式等价。 例如,处理表达式‘((a+b)*f)-(i/j)’,结果:‘(a+b)*f-i/j’。 分析: 首先考虑人处理这个问题的方法,就是依靠符 号来判断是否可以去括号。括号的前后,以及括号 内的符号,都需要考虑。因此,可以按照人的处理 方法,从最外层处理起,一层一层的去掉括号,这 便是分治的思想。而由于每次分治的处理过程基本 相同,用递归最为合适。
四、递推的应用(博弈问题)
走直线棋。有如下所示的一个编号为1到n的方格:
1 2 3 4 5 … … N-1 N
现由计算机和人进行人机对奕,从1到n,每次可以 走k个方格,其中k为集s={a1,a2, a3,....am}中的元 素(m<=4),规定谁最先走到第n格为胜,试设计一 个人机对奕方案,摸拟整个游戏过程的情况并力求 计算机尽量不败。

递推法和递归法的区别

递推法和递归法的区别

递推法和递归法的区别递推法和递归法是程序设计中常用的两种方法,它们都可以用来解决类似于数据处理、计算等问题。

虽然两种方法都可以实现同样的功能,但是它们的实现方式和运行机制却存在很大的不同。

本文将详细探讨递推法和递归法的区别。

一、概念解释递推法(Recursion)是指利用已知条件和递推关系式依次推导出未知结果的过程。

递推法可以理解为“顺着问题的发展过程,从已知的问题处理到未知的结果”。

它可以用于简化问题,使问题的计算过程不用涉及很多变量。

而递归法(Iteration)是指一个函数在定义中调用自己的过程。

递归函数会将问题拆分为一个个子问题,并且通过不断调用自身的方式来解决这些子问题。

递归法可以用于处理数据结构、树形结构等具有递归特性的问题。

二、实现方式递推法通常通过循环来实现,它可以用循环变量来记录已知条件和当前状态。

在每次循环中,根据递推关系式计算出下一次循环的结果。

因此,递推法的运行机制主要是循环和计算,递推法的实现方式更为直接和简单。

递归法则主要是通过函数的调用来实现。

递归函数会将问题拆分成一个个子问题,并通过调用自身的方式来解决这些子问题。

当问题被拆分至最小单元时,函数会返回结果,然后将所有的子问题的结果组合成一个完整的结果。

因此,递归法的实现基于函数的调用和返回,它更加灵活和方便。

三、运行机制递推法的运行机制主要是循环和计算,它可以通过循环变量来记录已知条件和当前状态,然后根据递推关系式计算出未知结果。

因此,递推法的效率通常比递归法更高。

而递归法则主要是基于函数的调用和返回来运行的。

递归函数会将问题拆分成一个个子问题,并通过调用自身的方式来解决这些子问题。

当问题被拆分至最小单元时,函数会返回结果,然后将所有的子问题的结果组合成一个完整的结果。

由于递归法需要使用函数的调用和返回,因此它的效率较低,而且递归深度过深容易导致栈溢出。

四、应用场景递推法适合于序列、条件递推等问题,因为在这些问题中,我们可以通过已知条件、递推关系式和循环变量来计算出未知结果。

递归练习题(打印版)

递归练习题(打印版)

递归练习题(打印版)### 递归练习题(打印版)#### 一、递归基础概念题1. 定义题:请简述什么是递归,并给出递归的基本形式。

2. 判断题:以下哪些函数是递归的?- A. `f(x) = x + 1`- B. `g(n) = n * g(n-1)` (n > 0)- C. `h(x) = x * h(x-1)` (x > 1)3. 简答题:递归和迭代有什么区别?#### 二、递归函数编写题1. 编写递归函数:编写一个递归函数,实现阶乘计算。

2. 编写递归函数:编写一个递归函数,实现斐波那契数列的第n项。

3. 编写递归函数:编写一个递归函数,实现汉诺塔问题的解决方案。

#### 三、递归算法应用题1. 应用题:如何使用递归算法解决归并排序问题?2. 应用题:使用递归算法解决二叉树的深度优先搜索(DFS)。

3. 应用题:描述如何使用递归算法实现图的深度优先搜索(DFS)。

#### 四、递归优化题1. 优化题:对于递归算法,如何避免重复计算?2. 优化题:请解释尾递归优化的概念,并给出一个尾递归的例子。

3. 优化题:如何使用记忆化递归(Memoization)来优化递归算法?#### 五、递归问题解决题1. 问题解决题:给定一个数字n,请使用递归算法找出n的二进制表示中1的个数。

2. 问题解决题:使用递归算法实现一个函数,判断一个字符串是否是回文。

3. 问题解决题:给定一个整数数组,使用递归算法找出数组中的最大值。

#### 六、递归思维拓展题1. 思维拓展题:递归算法在解决哪些类型的问题时特别有效?2. 思维拓展题:在编程中,递归算法有哪些潜在的缺点?3. 思维拓展题:请讨论递归算法在人工智能领域的应用。

#### 七、递归实践题1. 实践题:实现一个递归函数,用于计算组合数C(n, k)。

2. 实践题:编写一个递归函数,实现快速排序算法。

3. 实践题:给定一个字符串,使用递归算法实现字符串的反转。

递推与递归算法

递推与递归算法

递推与递归算法递推和递归是编程中常用的基本算法。

在前面的解题中已经用到了这两种方法,下面对这两种算法基本应用进行详细研究讨论。

一、递推递推算法是一种用若干步可重复的简单运算(规律)来描述复杂问题的方法。

[例1] 植树节那天,有五位参加了植树活动,他们完成植树的棵数都不相同。

问第一位同学植了多少棵时,他指着旁边的第二位同学说比他多植了两棵;追问第二位同学,他又说比第三位同学多植了两棵;…如此,都说比另一位同学多植两棵。

最后问到第五位同学时,他说自己植了10棵。

到底第一位同学植了多少棵树?解:设第一位同学植树的棵数为a1,欲求a1,需从第五位同学植树的棵数a5入手,根据“多两棵”这个规律,按照一定顺序逐步进行推算:①a5=10;②a4=a5+2=12;③a3=a4+2=14;④a2=a3+2=16;⑤a1=a2+2=18;Pascal程序:Program Exam1;Var i, a: byte;begina:=10; {以第五位同学的棵数为递推的起始值}for i :=1 to 4 do {还有4人,递推计算4次}a:= a+2; {递推运算规律}writeln(’The Num is’, a);readlnend.本程序的递推运算可用如下图示描述:递推算法以初始{起点}值为基础,用相同的运算规律,逐次重复运算,直至运算结束。

这种从“起点”重复相同的方法直至到达一定“边界”,犹如单向运动,用循环可以实现。

递推的本质是按规律逐次推出(计算)下一步的结果。

二、递归递归算法是把处理问题的方法定义成与原问题处理方法相同的过程,在处理问题的过程中又调用自身定义的函数或过程。

仍用上例的计算植树棵数问题来说明递归算法:解:把原问题求第一位同学在植树棵数a1,转化为a1=a2+2;即求a2;而求a2又转化为a2=a3+2; a3=a4+2; a4=a5+2;逐层转化为求a2,a3,a4,a5且都采用与求a1相同的方法;最后的a5为已知,则用a5=10返回到上一层并代入计算出a4;又用a4的值代入上一层去求a3;...,如此,直到求出a1。

小学数学中的递推和递归学习递推和递归的基本思想和方法

小学数学中的递推和递归学习递推和递归的基本思想和方法

小学数学中的递推和递归学习递推和递归的基本思想和方法递推和递归是数学中常见的两种求解问题的方法。

在小学数学中,递推和递归的思想和方法被广泛运用,帮助学生理解和解决各种数学问题。

本文将介绍递推和递归的基本概念、思想和解题方法。

一、递推的概念和思想递推是一种基于已知条件来求解未知项的方法。

它利用已知的前一项或前几项,通过确定的规律来求解后一项或后几项。

递推的思想可以用一个简单的公式来表示:an = an-1 + d其中,an表示第n项,an-1表示第n-1项,d表示公差或增量。

通过递推的方法,我们可以简单地找到某个数列中任意一项的值。

例如,给定一个数列1,4,7,10...,我们可以通过递推的思想得到第n项的值为1+(n-1)×3。

递推的优势在于其简单直观的计算方式,对于小学生而言易于理解和掌握。

通过递推的训练,学生可以培养自己的数学思维和观察问题的能力。

二、递归的概念和思想递归是一种通过将问题分解为更小的相似问题并解决它们的方法。

在递归中,问题的解决依赖于其自身的解决方案。

递归的思想可以通过以下公式表示:f(n) = f(n-1) + f(n-2)其中,f(n)表示第n项的值,f(n-1)表示第n-1项的值,f(n-2)表示第n-2项的值。

递归的思想与递推相比,更注重将问题分解为更小、更简单的子问题,并通过解决子问题来解决原始问题。

通过递归的方法,我们可以解决一些相对复杂的问题,比如斐波那契数列等。

递归在小学数学中的应用更多地体现在解决一些较为复杂、具有迭代关系的问题上,培养学生的逻辑思考和问题分解的能力。

三、递推和递归的解题方法1. 递推的解题方法递推的解题方法相对简单明了。

首先,我们需要观察数列的前几项,找出其中的规律和增量。

然后,根据已知的前一项,利用所确定的规律来求解后一项。

以求解等差数列为例,我们可以通过观察得到等差数列的递推公式:an = a1 + (n-1)×d,其中a1为首项,d为公差。

(2)递归与递推

(2)递归与递推

2.1 遍历问题【问题描述】我们都很熟悉二叉树的前序、中序、后序遍历,在数据结构中常提出这样的问题:已知一棵二叉树的前序和中序遍历,求它的后序遍历,相应的,已知一棵二叉树的后序遍历和中序遍历序列你也能求出它的前序遍历。

然而给定一棵二叉树的前序和后序遍历,你却不能确定其中序遍历序列,考虑如下图中的几棵二叉树:所有这些二叉树都有着相同的前序遍历和后序遍历,但中序遍历却不相同。

【输入】输入数据共两行,第一行表示该二叉树的前序遍历结果s1,第二行表示该二叉树的后序遍历结果s2。

【输出】输出可能的中序遍历序列的总数,结果不超过长整型数。

【样例】travel.inabcbcatravel.out42.2 产生数【问题描述】给出一个整数n(n<1030)和m个变换规则(m≤20)。

约定:一个数字可以变换成另一个数字,规则的右部不能为零,即零不能由另一个数字变换而成。

而这里所说的一个数字就是指一个一位数。

现在给出一个整数n和m个规则,要你求出对n的每一位数字经过任意次的变换(0次或多次),能产生出多少个不同的整数。

【输入】共m+2行,第一行是一个不超过30位的整数n,第2行是一个正整数m,接下来的m 行是m个变换规则,每一规则是两个数字x、y,中间用一个空格间隔,表示X可以变换成Y。

【输出】仅一行,表示可以产生的不同整数的个数。

【样例】build.in1 2 321 22 3build.out62.3 出栈序列统计【问题描述】栈是常用的一种数据结构,有n个元素在栈顶端一侧等待进栈,栈顶端另一侧是出栈序列。

你已经知道栈的操作有两种:push和pop,前者是将一个元素进栈,后者是将栈顶元素弹出。

现在要使用这两种操作,由一个操作序列可以得到一系列的输出序列。

请你编程求出对于给定的n,计算并输出由操作数序列1,2,…,n,经过一系列操作可能得到的输出序列总数。

【输入】就一个数n(1≤n≤1000)。

【输出】一个数,即可能输出序列的总数目。

递归与递推练习

递归与递推练习

递规与递推练习杨辉三角形(Triangle)【程序名称】triangle.exe【源程序名】triangle.(pas/c/cpp)【输入文件】triangle.in【输出文件】triangle.out【问题描述】有一个数字三角是我国古代著名数学家杨辉首先提出的,这个数字三角如下图所示:11 11 2 11 3 3 11 4 6 4 1……现在给你一个正整数n,请你用递归算法给出杨辉的前n行。

【输入数据】输入文件共一行,包含一个正整数n(1≤n≤20)。

【输出数据】输出文件共n行,即杨辉三角的前n行。

每行包含若干正整数,这些正整数之间用一个空格隔开(不能有多余的空格),最后一个正整数后面没有空格。

【样例】triangle.in4triangle.out11 11 2 11 3 3 1多米诺骨牌(Domino)【程序名称】domino.exe【源程序名】domino.(pas/c/cpp)【输入文件】domino.in【输出文件】domino.out【问题描述】有N块1×2大小的骨牌需要放入一个2×N的牌盒中,请问共有多少种放法(输出总放法数的最后100位即可)。

【输入数据】输入数据仅一个自然数N(N≤106)。

【输出数据】输出数据共4行,每行25位,共100位。

表示总放法数的最后100位。

不满100位时高位用0补足。

【样例】domino.in5domino.out0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008走楼梯(Stairs)【程序名称】stairs.exe【源程序名】stairs.(pas/c/cpp)【输入文件】stairs.in【输出文件】stairs.out【问题描述】有一楼梯共N阶,由于年久失修,其中有K阶台阶已经损坏(人不能在损坏的台阶上停留),已知某人一次能上一阶、两阶或三阶台阶,请问,此人从楼梯底部走到楼梯顶部,共有多少种走法。

递归与递推的概念

递归与递推的概念

递归与递推的概念1. 嘿,亲爱的编程小伙伴们!今天咱们来聊两个特别有意思的概念:递归和递推。

别看这两个名字听着挺唬人,其实它们就像是两个性格不同的双胞胎,一个爱往回看,一个喜欢往前冲!2. 咱们先说说递归,它就像是一个特别爱回忆的人。

打个比方,你问一个递归控:"你现在有多少钱?",他不会直接告诉你,而是会说:"等我问问昨天的自己有多少钱,再加上今天赚的就知道了。

"然后他又去问昨天的自己,昨天的自己又去问前天的自己。

直到问到最初的时候才开始往回算。

3. 来看个有趣的例子: "妈妈,咱家祖上几代人都姓张啊?" "得问问你奶奶。

" "奶奶,咱家祖上几代人都姓张啊?" "得问问你太奶奶。

" 这就是典型的递归思维!4. 递归就像是套娃,一个套一个,一层套一层。

每次都要往更小的问题钻,钻到最底层,再一层层往回冒。

有时候可把程序员愁坏了,因为套得太多容易把电脑内存给撑爆!5. 再说说递推,这家伙可就直接多了,是个实在人。

它不会像递归那样绕来绕去,而是踏踏实实地一步一步往前走。

就像盖房子,先打地基,再一层层往上盖,每一步都基于前面的结果。

6. 举个生动的例子: "小明,你知道你的零花钱是怎么算的吗?" "知道啊!每天比前一天多一块钱,昨天是5块,今天就是6块,明天就是7块。

" 这就是标准的递推思维!7. 递推特别适合那种知道起点,要算后面的值的问题。

比如兔子生兔子的问题,知道一开始有一对兔子,每个月都按固定规律生,要算第十个月有多少对,递推就特别好使。

8. 有意思的是,很多问题既可以用递归解决,也可以用递推解决。

就像爬楼梯,你可以从上往下想递归,也可以从下往上算递推。

选哪个全看你喜欢哪种思维方式!9. 不过要说哪个更省电脑资源,那肯定是递推了。

递归虽然写起来简单,但是总要存储很多中间状态,就像是搬家时非要把路上经过的每个地方都记下来一样,太费劲了!10. 递推就实在多了,只记住需要用到的状态,其他的都扔掉。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

题1:编码(encode.???)
【问题描述】
编码工作常被运用于密文或压缩传输。

这里我们用一种最简单的编码方式进行编码:把一些有规律的单词编成数字。

字母表中共有26个字母{a,b,……,z},这些特殊的单词长度不超过6且字母按升序排列。

把所有这样的单词放在一起,按字典顺序排列,一个单词的编码就对应着它在字典中的位置。

例如:
a --> 1
b --> 2
z --> 26
ab --> 27
ac --> 28
你的任务就是对于所给的单词,求出它的编码。

【输入格式】
仅一行,被编码的单词。

【输出格式】
仅一行,对应的编码。

如果单词不在字母表中,输出0。

【输入样例】
ab
【输出样例】
27
题2:特殊的子集(subset.???)
【问题描述】
集合M={1,2,3,……n}的子集中,有一些是不含相邻自然数元素的。

例如:n=4时,集合{1,3}是满足要求的,而{1,3,4}是不满足的,因为它含有相邻自然数3和4。

把所有满足要求的子集记作S i,对于每一个S i计算出它的所有元素的乘积T i,求∑T i2。

【输入格式】
仅一行,包括一个正整数n(n≤100)
【输出格式】
仅一行,即T i的平方和,可能会超出长整型范围。

【输入样例】
4
【输出格式】
119
题3:素数环(prime.???)
【问题描述】
给定一个n,求1..n组成的环,使得环上相邻的元素和为素数。

【输入格式】
n(1<=n<=10)
【输出格式】
把1放在第一位置,按照字典顺序不重复的输出所有解(顺时针,逆时针算不同的两种),相邻两数之间严格用一个整数隔开,每一行的末尾不能有多余的空格。

【输入样例】
8
【输出样例】
1 2 3 8 5 6 7 4
1 2 5 8 3 4 7 6
1 4 7 6 5 8 3 2
1 6 7 4 3 8 5 2
题4:火力网(fire.???)
【问题描述】
在一个n*n的阵地中,有若干炮火不可摧毁的石墙,现在要在这个阵地中的空地上布置一些碉堡。

假设碉堡只能向上下左右四个方向开火,由于建筑碉堡的材料挡不住炮火,所以任意一个碉堡都不能落在其它碉堡的火力范围内,请问至多可建造几座碉堡?
【输入格式】
第一行一个整数n(n<=10)。

下面n行每行为一个由n个字符构成的字符串,表示阵地的布局,包括空地('.'),和石墙('X')。

【输出格式】
一个整数,即最多可建造的碉堡数。

【输入样例】
4
.X.. .... XX.. ....
【输出样例】5。

相关文档
最新文档