累加类型
1.
第一个人10岁,第二个人比第一个人大两岁,以此类推,问第m个人的年龄
递归方法:
#include <iostream>
using namespace std;
int num=0,con=0;
int key(int n,int f)
{
if(n==con)
{
return num;
}
else
{
con++;
num=f+2;
key(n,num);
}
}
int main()
{
cout<<key(5,10)<<endl;
return 0;
}
核心代码
con++;
num=f+2;
key(n,num);
2.
计算1+…+n
#include <iostream>
using namespace std;
int num=0,con=0;
int key(int n)
{
if(n==con)
{
return num;
}
else
{
con++;
num+=con;
key(n);
}
}
int main()
{
cout<<key(100)<<endl;
return 0;
}
核心代码
con++;
num+=con;
key(n);
计算n的阶乘
#include <iostream>
using namespace std;
int num=1,con=0;
int key(int n)
{
if(n==con)
{
return num;
}
else
{
con++;
num*=con;
key(n);
}
}
int main()
{
cout<<key(10)<<endl;
return 0;
}
核心代码
con++;
num*=con;
key(n);
4.菲波那切数列
#include <iostream>
using namespace std;
int key(int n,int f,int s)
{
if(n)
{
int temp=s;
s+=f;
f=temp;
key(n-1,f,s);
}
else
{
return s;
}
}
int main()
{
/*菲波那切数列前两项是0 1情况下*/
cout<<"请输入想得到第几位菲波那切数列 位数从1开始"<<endl;
int n;
cin>>n;
n=n-2;
if(n==-1||n==0)
{
if(n==-1)
{
cout<<0<<endl;
}
else
{
cout<<1<<endl;
}
return 0;
}
cout<<key(n,0,1)<<endl;
return 0;
}
真正的递归
#include <iostream>
using namespace std;
int key(int n)
{
if(n==1||n==2)
{
if(n==1)
return 0;
else
return 1;
}
return key(n-1)+key(n-2);
}
int main()
{
/*菲波那切数列前两项是0 1情况下*/
cout<<"请输入想得到第几位菲波那切数列 位数从1开始"<<endl;
int n;
cin>>n;
cout<<key(n)<<endl;
return 0;
}
核心代码
return key(n-1)+key(n-2);
我们可以看到,每一个问题递归实现的方式的都不同,然而程序能运行出正确结果而且最精简的,最能体现自我调用的,最能实现抽象问题才是最好的递归解决方案。
拿最后这个题为例,我们可以看到有如下对应关系
1.斐波那契“第三项”是前两项的和
2.程序中对应了第三项key的值就是key(n-1)+key(n-2)
抽象对应具体代码的翻译
我在第一次接触递归解决一个全排列问题的时候那个问题有如下对应关系
1.问题上看去,全排列可以看成是,在第一次其他数不动的基础上第一个数改变位置(一共有9个位置可以改变),然后第二次就是在第一个数动完之后(还有8个位置可以随意变换从而生成新的排列),以此类推到第10个数
2.代码上对应就是
for(int i=begin;i<=end;i++)
{
Swap(data[begin],data[i]);
permuation(begin+1,end);
Swap(data[begin],data[i]);
}
而现在看来这里(permuation(begin+1,end)
)我们既可以用permuation(begin+1,end)也可以用permuation(begin,end-1),因为这样都能达到我们第n次可移动的位置是最初可移动位置-n
的目的。
再多练练。