递归学习(1)

·递归的特点是函数调用它自己本身。其中直接调用自己称为直接递归,而将a调用b,b又调用a的递归叫间接递归。

eg1 1201:菲波那契数列
菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。给出一个正整数a,要求菲波那契数列中第a个数是多少。 
复制代码
#include<bits/stdc++.h>
using namespace std;

int f(int m){
   if(m==1)  return 1;//数列的第一个数为1
   else   if(m==2)  return 1;//数列的第一个数为2
   else return f(m-1)+f(m-2);//其它每个数等于前两个数字之和
}
 
int main(){
    int n,a[10005];
  cin>>n;
  for(int i=1; i<=n; i++)  cin>>a[i];
  for(int i=1; i<=n; i++)  cout<<f(a[i])<<endl;//调用
  return 0;
}
复制代码

 

·递归要素:1.拆解复杂问题至一个或几个重复的简单步骤(如上题“每个数等于前两个数之和”)
      2.以特殊情况作为返回的点(否则程序死循环)
 
·个人认为重点在于分析与拆解问题,从头到尾再从尾到头理解路径
eg2 1315:【例4.5】集合的划分
复制代码
#include<bits/stdc++.h>
using namespace std;

long long f(long long n,long long k){
    if(n<k || k==0){
        return 0;
    }else if(n==k){
        return 1;
    }else if(k==1){
        return 1;//分析特殊情况
    }else return f(n-1,k-1)+k*f(n-1,k);//一般情况下的总类数
    
}

int main(){
    long long n,k;
    cin>>n>>k;
    cout<<f(n,k)<<endl;
    return 0;
}//数据大时记得用long long()
复制代码

 

eg3 1204:爬楼梯

树老师爬楼梯,他可以每次走1级或者2级,输入楼梯的级数,求不同的走法数。

例如:楼梯一共有3级,他可以每次都走一级,或者第一次走一级,第二次走两级,也可以第一次走两级,第二次走一级,一共3种方法。

复制代码
#include<bits/stdc++.h>
using namespace std;

int f(int n){
    if(n==1)
        return 1;//一阶楼梯一种走法
    else if(n==2)
        return 2;//两阶楼梯两种走法
    else
        return f(n-1)+f(n-2);//一般情况楼梯总走法数是前一阶总走法+前两阶总走法(因为要么走一阶要么走两阶)
}

int main(){
    int n;
    while(cin>>n){
        cout<<f(n)<<endl;
    }
    return 0;
}
复制代码

 

eg4 1316:【例4.6】数的计数(Noip2001) 

我们要求找出具有下列性质数的个数先输入一个自然数,然后对此自然数按照如下方法进行处理:不作任何处理;在它的左边加上一个自然数,但该自然数不能超过原数的一半;加上数后,继续按此规则进行处理,直到不能再加自然数为止。

(超时版代码)

 

复制代码
#include<bits/stdc++.h>
using namespace std;

int n;
int s=0;

void ss(int t){
    for(int m=1; m<=t/2; m++){
        s++;
        if(m>=2)//尝试优化未遂
                {
            ss(m);
        }
    }
}

int main(){
    cin>>n;
    ss(n);
    cout<<s+1<<endl;//加上自己
    return 0;
}
复制代码

 

posted @   竹余居居居居居  阅读(67)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示