最近在学习函数的递归,这也是开始学习代码半年来第二次递归的学习,第一次学习的时候浑浑噩噩,导致了第二次学习就像新知识一样,但是递归的用处是非常大的,同时我觉得这个难度对于我这种新手来说也是同样的大。
递归,我认为就是将一个复杂的问题转换成一个非常简单的问题,并通过反复的解决这个简单的问题最后解决复杂的问题。我最近练习的题中比较经典的有斐波拉契数列,汉诺塔等问题。
像斐波拉数列这样的问题是这样的:
数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。
给出一个正整数a,要求菲波那契数列中第a个数是多少。
这个问题转化成数学表达式就是n=(n-1)+(n-2);
n1=1,n1=1;
那么递归解决的话,我就要知道他的终止条件,显然就是从第n个数不断的往前求直到n=1和n=2;
那么代码实现如下
#include <iostream>
using namespace std;
int f(int n)
{
if(n==1||n==2)
return 1;
return f(n-1)+f(n-2);
}
int main()
{
int n,m,i;
cin>>n;
for( i=0;i<n;i++)
{
cin>>m;
cout<<f(m)<<endl;
}
return 0;
}
由此我们可以推广到上楼梯
树老师爬楼梯,他可以每次走1级或者2级,输入楼梯的级数,求不同的走法数
例如:楼梯一共有3级,他可以每次都走一级,或者第一次走一级,第二次走两级
也可以第一次走两级,第二次走一级,一共3种方法。
这个题可以看成有n个楼梯要上或者下,每次下一个或两个,那么直到剩两个到底或者剩一个到顶的时候结束。
由此代码的大体思路有了我们就可以开始写了
#include<iostream>
#include<cmath>
using namespace std;
int s(int n)
{
if(n==2)
return 2;
if(n==1)
return 1;
return s(n-2)+s(n-1);
}
int main()
{
int num;
while(cin>>num)
{
cout<<s(num)<<endl;
}
}