递推和递归作业

合集下载

递推和递归作业

递推和递归作业

题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. 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。

相关文档
最新文档