初步的学习经验

最近在学习函数的递归,这也是开始学习代码半年来第二次递归的学习,第一次学习的时候浑浑噩噩,导致了第二次学习就像新知识一样,但是递归的用处是非常大的,同时我觉得这个难度对于我这种新手来说也是同样的大。
递归,我认为就是将一个复杂的问题转换成一个非常简单的问题,并通过反复的解决这个简单的问题最后解决复杂的问题。我最近练习的题中比较经典的有斐波拉契数列,汉诺塔等问题。
像斐波拉数列这样的问题是这样的:
数列的第一个和第二个数都为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;

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值