递归算法。

递归算法

基本思想:层层分解,大问题------>一个或者多个小问题;
关键
递归定义:问题向边界条件转化的规则。
终止条件:所描述问题的最简单情况。
步骤
1.分析问题,寻找递归。
2.设置边界,控制递归,找出终止条件
3.设计函数,确定参数。

# 解决的问题:
1.汉诺塔问题:约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下、由小到大顺序串着由64个圆盘构成的塔。目的是将最左边杆上的盘全部移到中间的杆上,条件是一次只能移动一个盘,且不允许大盘放在小盘的上面。
这是一个著名的问题,几乎所有的教材上都有这个问题。由于条件是一次只能移动一个盘,且不允许大盘放在小盘上面。
分析问题
递归思想:第一个初始位置到过渡位置,第二个到目标位置。
n-1个看成一个,第n个看成一个,回归之前的步骤。
将n个圆盘移动----->分解成两个圆盘移动过程。
终止条件:n=1时,直接移到目标位置结束。
#include
using namespace std;
void move(int n,char a,char b,char c)
{
if(n==1)
cout<<a<<"->"<<n<<"->"<<b<<endl;\\最后一个移到目标位置
else
{
move(n-1,a,c,b);\\将n-1个圆盘移动到过渡位置
cout<<a<<"->"<<n<<"->"<<b<<endl;
move(n-1,c,b,a);
}
}
int main()
{
int n;
char a,b,c;
cin>>n>>a>>b>>c;
move(n,a,b,c);
return 0;
}
2.全排列问题
给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。 我们假设对于小写字母有’a’ < ‘b’ < … < ‘y’ < ‘z’,而且给定的字符串中的字母已经按照从小到大的顺序排列。
分析问题
递归思想:先排高位再排低位。
终止条件:排到最后一位的时候输出。
#include
#include
char a[10],b[10];//b数组用来记录输出
bool flag[10]={0};//标识作用很重要
int s;
void qpl(int n)
{
if(n ==s+1)//终止条件:排到最后一位输出
{
b[s+1]=0;
printf("%s\n",&b[1]);
}
else
{
for(int i=0;i<s;i++)
if(flag[i]==0)//用标识flag来控住对数组b的赋值从而进行排列
{
flag[i]=1;
b[n]=a[i];
qpl(n+1);
flag[i]=0;
}
}
}
int main()
{
scanf("%s",a);
s=strlen(a);
qpl(1);
return 0;
}
3.Pell数列a1, a2, a3, …的定义是这样的,a1 = 1, a2 = 2, … , an = 2 * an − 1 + an - 2 (n > 2)。
给出一个正整数k,要求Pell数列的第k项模上32767是多少。
递归思想:一直递减n=1.n=2.问题最简单化。
终止条件:n ==1,n ==2。时输出。
#include
using namespace std;
int a[1000001];
int fn(int n)
{
if( n ==1)
return 1;
if(n ==2)
return 2;
if(a[n]!=0)
return a[n];
return a[n]=(2fn(n-1)%32767+fn(n-2)%32767)%32767;//最关键点也是本题可以学到的地方,根32767取模。
}
int main()
{
int a,b;
cin>>a;
while(a–)
{
cin>>b;
cout<<fn(b)<<endl;
}
}
4.把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
递归思想:这个问题可以分为1.n>m,必定有n-m个盘子永远空着,去掉它们对摆放苹果方法数目不产生影响。
2.当n<=m时,分成两类:至少一个盘子空着:f(m,n) = f(m,n-1); 所有盘子都有苹果:每个盘子中拿掉一个苹果f(m,n) = f(m-n,n). 而总的放苹果的放法数目等于两者的和f(m,n) =f(m,n-1)+f(m-n,n)。
终止条件:当m=0或n=1时,只有一种放法。
#include
using namespace std;
int f1(int m,int n)
{
if(m ==0||n ==1)
return 1;
if(m<n)
return f1(m,m);
else
return f1(m,n-1)+f1(m-n,n);
}
int main()
{
int n,i,a,b;
cin>>n;
for(i=0;i<n;i++)
{
cin>>a>>b;
cout<<f1(a,b)<<endl;
}
}
5.逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3。逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为
+ 2 3 4。本题求解逆波兰表达式的值,其中运算符包括+ - * /四个。
递归思想:分解成一步一步计算求值。
终止条件:遇到计算符号时进行计算。
#include
#include
using namespace std;
double f1()
{
char a[100];
scanf("%s",a);
switch(a[0])
{
case ‘+’:return f1()+f1();
case ‘-’:return f1()-f1();
case ‘’:return f1()f1();
case ‘/’:return f1()/f1();
default: return atof(a);
break;
}
}
int main()
{
printf("%f\n", f1());
return 0;
}
6.文件结构“图“
递归思想:大的目录递减到最小的目录。
终止条件:到最小的目录时输出。
#include
#include
#include
#include
using namespace std;
string a;
int cc;//输出深度
int now=1;//记录当前
数量
int flag=0;
void work()
{
string str[50];//储存该目录下的文件
int l=0;
while(cin>>a)
{
if(flag ==0&&a[0]!=’#’)
{
cout<<“DATA SET “<<now<<”:”<<endl;
cout<<“ROOT”<<endl;
flag=1;
}
if(a[0] ==’#’)
return;
else if(a[0] ==’
’)
{
cc=0;
sort(str+0,str+l);
for(int i=0;i<l;i++)
{
cout<<str[i]<<endl;
}
cout<<endl;
now++;
//cout<<“DATA SET “<<now<<”:”<<endl;
//cout<<“ROOT”<<endl;
flag=0;
work();
}
else if(a[0] ==‘d’)
{
//cc++;
//str[l] =a;
//l++;
cc++;
for(int i=1;i<=cc;i++)
{
cout<<"|";
for(int j=1;j<=5;j++)
cout<<" ";
}
cout<<a<<endl;
work();
}
else if(a[0] ==‘f’)
{

         str[l]=a;
         l++;
         continue;
     }
     else if(a[0]==']')
     {
         
         sort(str+0,str+l);
        for(int i=0;i<l;i++)
         {    
             for(int k=1;k<=cc;k++)
             {    
                 cout<<"|";
                 for(int j=1;j<=5;j++)
                 cout<<" ";
             }
             cout<<str[i]<<endl;
         }
         cc--;
         return;
     }
 }

}
int main()
{
//freopen(“r.txt”,“r”,stdin);
//freopen(“w.txt”,“w”,stdout);
work();
return 0;
}

自我总结

1.这周学习了递归思想这个思想看似简单,但是对于难题真正想要找到它的终止条件,递归思路还是有些困难,还有使用代码写出来更困难了。
2.主要学习到了可以用另一个个全局变量的数组进行记录解题。还有取模的方法来防止数值超出范围。用压栈的知识点写逆波兰达表达题。
3.对于老师上课的知识点对于我来说好多是我没有学过的。我应该上课预习,课后复习。对于文件结构图的代码的写法还是不会,要我自己再仔细思考。

发布了23 篇原创文章 · 获赞 0 · 访问量 340

猜你喜欢

转载自blog.csdn.net/qq_45762392/article/details/104661214