递归函数总结

一、递归函数总述

1、递归函数:在函数定义中出现直接或间接对自身的调用的函数。

2、作用:解决多次重复计算,通常把问题由大化小,小问题一般为已知或易得到的数据。

3、优点:大大减少了程序的代码量,用有限的语句来定义对象的无限集合。

4、运用心得:要勤加练习,形成一个自己的思考方式,从而找对其中的递归关系。

二、递归题型总结

1、首先以求n的阶乘为例

#include <bits/stdc++.h>

using namespace std;

int jc(int n);

int main()

{

   int n;

   cin>>n;

   cout<<jc(n)<<endl;

   return 0;

}

int jc(int n)

{

   if(n==0||n==1) return 1;

   return n*jc(n-1);//此处体现了n的阶乘就等于n乘以n-1的阶乘,直到递归到1

}

2、用递归方法求最大公约数问题

(同求n的阶乘类型一致,只需找出其中的递归关系即可,在此只说明具体递归函数)

int gys(int m,int n)//求m,n的最大公约数

{

   return n==0? m:gys(n,m%n);//当余数为0时,最大公约数就是其除数,在此用三元运算符体现,效果等同if语句

}

3、数据查找问题(二分查找递归)

#include<bits/stdc++.h>

using namespace std;

int a[1001];

void search(int x,int m,int n);//从第m个数据到第n个数据中寻找x

int main()

{

   int i,x,m,n;

   cin>>x>>m>>n;

   for(i=m;i<=n;i++)

      cin>>a[i];//数据大小已经按照由大到小排序输入,如果乱序先要排序

   search(x,m,n);

   return 0;

}

void search(int x,int m,int n)

{

   int mid;

   if(m<=n)//这里需要m<=n

   {

      mid=(m+n)/2;//求出中间数的位置

      if(x==a[mid]) cout<<"YES"<<endl;

      else

      {

         if(x<a[mid]) search(x,mid+1,n);//判断在前半段还是后半段以确认接下来在哪段查找

         else search(x,m,mid-1);

      }

   }

   else cout<<"NO"<<endl;

}

4、半数集问题(记忆化搜索)

#include<bits/stdc++.h>

using namespace std;

int r[1001];//定义一个数组r,用于存放已经计算出的该数集内元素个数

void bsj(int m)

{

   int i;

   if(r[m]!=-1) return r[m];//已经被赋值的可直接调用

   r[m]=1;//m本身也是一种情况,故赋值1

   for(i=1;i<=m/2;i++)

   {

      bsj(i);

      r[m]+=r[i];//将m的所有分集求和得r[m]并记录数据

   }

int main()

{

   int n;

   cin>>n;

   for(int i=1;i<=n;i++)

      r[i]=-1;//r数组初始化

   bsj(n);

   cout<<r[n];//利用记忆数据求解

   return 0;

}

5、全排列问题

void qpl(int list[],int k,int m)

{

   if(k==m)//构成一次全排列,输出结果

   {

      for(int i=0;i<=m;i++)

      cout<<list[i]<<" ";

      cout<<endl;

   }

   else

      for(int j=k;j<=m;j++)

      {

         swap(list[k],list[j]);//固定位置k,j从k到m不断赋值与固定位置替换

         qpl(list,k+1,m);//固定下一个位置,重复操作,直到k=m

         swap(list[k],list[j]);//完成一次排序后换回

      }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值