博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
递归C++
阅读量:5024 次
发布时间:2019-06-12

本文共 2279 字,大约阅读时间需要 7 分钟。

递归C++

一、递归简介

自己调用自己

二、递归写法

2.1 写法介绍

先写出问题的递推公式

递归部分的边界条件就是递推公式中的边界条件

递归部分的主体部分就是递推公式中的主体部分

 

2.2 实例

(1)题目

例如:求n!。

(2)分析

递归公式为 f(n)=f(n-1)*n f(1)=1;

对应的递归:

1 /* 2     阶乘递归  3     递归公式为 f(n)=f(n-1)*n f(1)=1; 4     递归部分的边界条件就是递推公式中的边界条件 f(1)=1 5     递归部分的主体部分就是递推公式中的主体部分 f(n)=f(n-1)*n 6 */ 7 int factorial_Recursion(int n){ 8     if(n==1) return 1; 9     else return factorial_Recursion(n-1)*n;10 }

(3)完整代码

1 #include 
2 using namespace std; 3 4 int factorial(int n); 5 int factorial_Recursion(int n); 6 7 /* 8 阶乘非递归 9 */10 int factorial(int n){11 int ans=1;12 for(int i=1;i<=n;i++){13 ans*=i;14 }15 return ans;16 }17 18 /*19 阶乘递归 20 递归公式为 f(n)=f(n-1)*n f(1)=1;21 递归部分的边界条件就是递推公式中的边界条件 f(1)=122 递归部分的主体部分就是递推公式中的主体部分 f(n)=f(n-1)*n23 */24 int factorial_Recursion(int n){25 if(n==1) return 1;26 else return factorial_Recursion(n-1)*n;27 }28 29 int main(){30 int ans;31 //ans=factorial(5); 32 ans=factorial_Recursion(5); 33 printf("%d\n",ans);34 return 0;35 }

(4)代码结果

120

 

三、递归实例

3.1 辗转相除法求公约数

递推公式:f(a,b)=f(b,a%b) b!=0;

代码:

1 #include 
2 using namespace std; 3 4 void exchange(int &a,int &b); 5 int commonDivisor(int a,int b); 6 int commonDivisor_Recursion(int a,int b); 7 8 /* 9 交换a和b两个数的值 10 */11 void exchange(int &a,int &b){12 a=a^b;13 b=a^b;14 a=a^b; 15 } 16 17 /*18 非递归辗转相除法求公约数:19 用辗转相除法的时候要保证a大于等于b 20 */21 int commonDivisor(int a,int b){22 if(b>a) exchange(a,b);23 int tmp=a%b;24 while(tmp){25 a=b;26 b=tmp;27 tmp=a%b;28 }29 return b;30 } 31 32 /*33 递归辗转相除法求公约数:34 用辗转相除法的时候要保证a大于等于b 35 递推公式:f(a,b)=f(b,a%b) b!=0;36 边界条件为: b!=037 递归主体为: f(a,b)=f(b,a%b)38 */39 int commonDivisor_Recursion(int a,int b){40 if(a%b==0) return b;41 else commonDivisor_Recursion(b,a%b);42 }43 44 int main(){45 int ans;46 //ans=commonDivisor(15,9);47 ans=commonDivisor_Recursion(15,9);48 printf("%d\n",ans);49 return 0;50 }

代码结果:

3

 

3.2 判断和相等

题目:

已知一个一维数组a[1...n]和一个确定的数m,判断能否使数组a中的任意几个元素之和等于m,能则输出YES,不能则输出NO。

分析:

分为取a[n]和不取a[n]的情况,则递推公式为:

f(n,m)=f(n-1,m-a[n])||f(n-1,m) 

这里可以用一个全局变量来输出结果,只有有一种情况满足了,就满足了。

这个题目没完,后面要补。

 

转载于:https://www.cnblogs.com/Renyi-Fan/p/6914840.html

你可能感兴趣的文章
fee photo
查看>>
PLSQL如何输出字典的脚本文件.sql
查看>>
idea热部署+自动编译
查看>>
SharePoint表单和工作流 - Nintex篇(三)
查看>>
mysql调优
查看>>
AlexNet详解
查看>>
清除目录下的SVN信息
查看>>
JS 定时提交 以及 保持在网页存在的时候session不失效的小技巧
查看>>
PYTHON常用数据类型(列表,元组,字典)
查看>>
nginx负载均衡tomcat和配置ssl
查看>>
SVN 错误 Access to SVN Repository Forbidden的原因及解决方法
查看>>
[转]PHP语言的数据库操作函数的理解
查看>>
ADO.Net中DataTable的应用
查看>>
Android Studio 学习 - Activity生命周期
查看>>
[转]application.properties详解 --springBoot配置文件
查看>>
浏览无法加载控件
查看>>
ModelSim应用笔记
查看>>
Android GridView、ListView、ScrollView上下拉刷新
查看>>
Hydra的使用
查看>>
定义为HTML属性的事件句柄的作用域
查看>>