其他分享
首页 > 其他分享> > 递归小结

递归小结

作者:互联网

递归小结

最大奇约数:

题目


定义函数f(x)表示x的最大奇约数,这里x表示正整数。例如,f(20) = 5,因为20的约数从小到大分别有:1, 2, 4, 5, 10, 20,其中最大的奇约数为5。

给出正整数N,求f(1)+f(2)+…+f(N)


集合的划分:

题目


设S是一个具有n个元素的集合,S{a1,a2,….,an},现将S划分成k个满足下列条件的子集合S1,S2,…,Sk,且满足:

Si≠∅

Si∩Sj=∅ (1<=I,j<=k i≠j)

S1∪S2∪S3∪…Sk=S

则称S1,S2,…,Sk是集合S的一个划分。它相当于把S集合中的n个元素a1,a2,…,an放入k个(0<k<=n<30)无标号的盒子中,使得没有一个盒子为空。请你确定n个元素a1,a2,…,an放入k个无标号盒子中去划分数S(n,k)。


分形图系列:

三道小题:


题目描述

分形(Fractal)通常被定义为“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”,即具有自相似的性质。例如一棵蕨类植物,仔细观察,你会发现,它的每个枝杈都在外形上和整体相同,仅仅在尺寸上小了一些。而枝杈的枝杈也和整体相同,只是变得更加小了。那么,枝杈的枝杈的枝杈呢?自不必赘述。图展示了4种类型的分形图。

avatar

魔法世界的科学家由此提出分形宇宙论,即认为宇宙本质上是一个粒子。构成宇宙的无数个粒子里面又会有其他小宇宙。

例如:一个尺度的宇宙表示为:

X

两个尺度宇宙表示为

复制X  X

  X

X  X

如果用B(n-1) 表示n-1尺度的宇宙,则递归定义为:

复制
B(n-1)        B(n-1)

        B(n-1)

B(n-1)        B(n-1)

输入格式

输入有多组数据,每组一个整数n(n≤7),表示宇宙的尺度。

输出格式

每组数据以字母“X”绘出分形图,每组数据以一个“-”表示结束。


斐波那契数列:

​ 第一个月一对兔子(刚出生),每对兔子两个月后便可以生一对兔子,恰好一雌一雄。六个月后丧失生育能力,八个月后死亡,求第n个月时有多少兔子?

​ 构建递推式即可

在递归中,如何记录经过的数据?

如题:


题目描述

已知 n 个整数 x1,x2,……,xn以及 11个整数 kk<n)。从 n 个整数中任选 k 个整数相加,可分别得到一系列的和。例如当 n=4k=3,4 个整数分别为 3,7,12,19 时,可得全部的组合与它们的和为:

3+7+12=22

3+7+19=29

7+12+19=38

3+12+19=34

现在,要求你计算出和为素数共有多少种。

例如上例,只有一种的和为素数:3+7+19=29

输入格式

第一行两个空格隔开的整数 n,k(1≤n≤20,k<n)。

第二行 n个整数,分别为 x1,x2,……,xn(数据范围)。

输出格式

输出一个整数,表示种类数。


如何记录这种情况是否处理过呢?

首先可以想到,这三个数的和可能是相同的,因此可以抓住这点来存储每一种状态。但显而易见的是,在x != y != z != l != m != n的情况下, x + y + z

仍有可能等于l + m + n。

那么我们就可以将每个数以幂的形式存储起来,拉大差距,即x^a + y^a + za,a越大,xa + y^a + z^a = l ^a + m^a + n^a的概率也就越低了,也就可以达到存储状态的目的。

但这种存储方法有一种缺点就是会占用大量的内存,时间复杂度会出奇的高(当让也可以通过其他方式来存储状态,例如状态压缩)

也可以用动态数组或bool数组等方式进行记录,暂且不提

另一种独辟蹊径的方式就是,既然可能会重复,那么为何不试着使计算不重复呢?

如下代码

#include<cstdio>
#include<cmath>//引入头文件 
using namespace std;
int n,k,a[21],s=0,ans=0;//定义全局变量,方便写函数 
bool f[21];//判断该数有没有被选过,用bool型变量 
int ss(int x)//定义判断素数的函数 
{
    if(x==1||x==0)return 0;//考虑特殊情况(虽然和为1或0不太可能,但还是要预防一下极品数据) 
    for(int i=2;i<=sqrt(x);i+=1)//sqrt为平方根函数,需要调用cmath库,sqrt(x)用处详解请见上
    //从2开始循环是因为任何一个数mod(就是%)1都等于0 
        if(x%i==0)//一旦发现该数能mod尽除1和它本身的数,立即返回0 
            return 0;
    return 1;//若一直运行到i==sart(x)时都没有退出,则该数为素数,自动返回1 
}
int xs(int x,int y)//该函数是本程序中最关键的部分,认真看哦 
{//x为已经选了几个数,y为选第几个数 
    for(int i=y;i<=n;i+=1)//从y~n循环是为了避免重复的出现,例如1234中,选3个,已经选过123 

(持续更新中ing)

最后

​ 那么对于递归,其要素又在哪里呢?

首先,将一个小规模的问题替换题目,再用一个规模稍大的来替换,从中发现规律,即子问题构型!

​ 通过子问题构型,即可确定递归式

​ 接下来,确定递归的边界条件,一个递归的大致框架就好了。

​ 但同样重要的,还要确定形参的意义。好的形参能方便思考,简化代码,因此得慎重考虑。

标签:约数,...,递归,.......,---,...............,小结
来源: https://www.cnblogs.com/CZ-9/p/16435664.html