递归

定义 :定义一个函数时出现调用本函数的成分,称之为递归

直接递归,自己调自己

间接递归,函数p调函数q,q又调用p

尾递归,递归函数中,递归调用语句是最后一句

递归应满足的条件 :

需要解决的问题可以转化为一个或多个子问题来求解,而这些子问题的求解方法和原问题完全相同,只是在数量规模上不同

递归次数必须是有限的

必须是有结束递归的条件来终止递归 示例:

// 1.求阶乘问题,2.递归的次数是 n

int fun(int n){

if(n==1) //3. 当满足条件时,递归终止

return 1;

else

return (fun(n-1)*n); //递归调用

}

//因为fun函数是自己调自己所以称之为 直接递归

//又因为递归调用是最后一条语句所以又称为 尾递归

递归存在的问题:

耗费时间和空间,因为每次函数调用需要时间,每一次调用都需要为其开辟一个内存栈用来保留不同的参数,返回地址,临时变量,压栈出栈也需要时间

可能会存在重复计算 比如斐波那契列数列

栈内存可能会溢出

递推(迭代 )

定义:广义来说,凡是在某一算式的基础上从已知的值推出来未知的值,都可以称为递推(说白了 就是找规律)

常见的递归和递推问题

求阶乘问题(递归、递推)

// 递归

int fun(int n){

if(n==1)

return 1;

else

return (fun(n-1)*n);

}

// 递推

int n,s=1;

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

s=s*i;

}

斐波那契数列(递归、递推)

fib(n)=1 n=1

fib(n)=2 n=1

fib(n)=fib(n-1)+fib(n-2)

例如:1、1、2、3、5、8、13、21......

// 递归

int Fib(int n){

if(n==1 || n==2)

return 1;

else

return (Fib(n-1)+Fib(n-2));

}

// 递推 求第七项值

int a=1,b=1,c,n=7;

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

if(i<=2)

c=1;

else{

c=a+b;

a=b;

b=c;

}

}

printf("%d",c);

汉诺塔问题

n皇后问题

捕鱼问题(递推)

A,B,C,D,E五个渔夫夜间合伙捕鱼,,第二天A先醒来,他把鱼均分五份,把多余的一条扔回湖中,便拿了自己的一份回家了,B醒来后,也把鱼均分五份,把多余的一条扔回湖中,便拿了自己的一份回家了,C,D,E也按同样方法分鱼。问5人至少捕到多少条鱼?

第一种思路:逆推

假如A醒来鱼的总数=5n1+1

那么第B醒来鱼的总数为 4n = 5* n2+1

设当前鱼的总数为 Sn 那么上一次鱼的总数 S(n+1)=Sn/4*5+1

第二种:假如多给四条鱼那么就不用仍了,设总数为 x

A走之后剩下的鱼 x * 4/5

B走之后剩下的鱼 x * 4/5* 4/5

C走之后剩下的鱼 x * 4/5 * 4/5 * 4/5

D走之后剩下的鱼 x * 4/5 * 4/5 * 4/5 * 4/5

E走之后剩下的鱼 x * 4/5 * 4/5 * 4/5 * 4/5 * 4/5=x*1024/3125

鱼一定是整数 所以 x = 3125

减去多给的四条 所以鱼最少为 3121

#include

using namespace std;

int main(){

int f[5],flag=1,n=1;

while(flag==1){

f[0]=5*n+1; //第一次执行是 E醒来鱼的条数

flag=0;

for(int i=1;i<5;i++){

if(f[i-1]%4!=0){ //只有A醒来鱼的总数不是4的倍数,其他人必须都是

flag=1;

break;

}

f[i]=5*f[i-1]/4+1; // 上一个人鱼的总数

}

n++; //试找满足条件的n

}

cout<

return 0;

}

平面分割(递推)

在平面上画n>0条封闭的曲线,各曲线之间两两相交于两点,并且任意三条封闭的曲线都不相交于一点,求这样的n条曲线将平面分成多少个区域?

曲线数n

区域数

1

2

2

4

3

8

4

14

5

22

规律:

2+n*(n-1)

#include

using namespace std;

int main(){

int n,Sn;

while(1){

cin>>n;

if(n==0){

cout<

break;

}

Sn=n*(n-1);

cout<<2+Sn<

}

}

杨辉三角取值问题(递推)

输入:输入n、m代表取的第几行第几列 (n>=m、n>0 m>0)

杨辉三角的性质:第n行第m列的值为 C(n-1)(m-1) 即为从n-1个不同元素中取m-1个元素的组合数。

// 取值问题

include

using namespace std;

int f(int n){

int s=1;

if(n==0)

return 1;

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

s=s*i;

}

return s;

}

int main(){

int n,m;

cout<=m)"<

cin>>n>>m;

if(n

cout<

return -1;

}

else{

int a=f(n-1),b=f(n-m)*f(m-1);

cout<

}

}

// 杨辉三角打印问题

#include

using namespace std;

int main(){

int n;

cout<

cin>>n;

int a[100][100];

for(int i=0;i

for(int j=0;j

if(j==0)

a[i][j]=1;

if(i==j){

a[i][j]=1;

break;

}

if(i>=2&&i!=j&&j!=0){

a[i][j]=a[i-1][j-1]+a[i-1][j];

}

}

}

for(int i=0;i

for(int j=0;j

if(i==j){

cout<

c语言中用递推法解决渔夫问题,递归、递推 - IT小冰的个人空间 - OSCHINA - 中文开源技术交流社区...相关推荐

  1. c语言0阶乘分之一前三十项,MuPAD使用总结 - osc_wws45aot的个人空间 - OSCHINA - 中文开源技术交流社区...

    MuPAD使用总结 一.打开notebook界面的方法: 二.notebook界面的三种区域 (一).输入区域 输入区域在打开来的时候就有,就是 ,但是之后如果还想再加,可以点击上方红色框内的图标. ...

  2. c语言怎样将字符串存入指针属猪,字符数组全排列 - Lu堅的个人空间 - OSCHINA - 中文开源技术交流社区...

    // win32Console.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include //参数为引用,函数调用多,所以定义我内联 ...

  3. 用c语言编写oj成绩排名,OJ题:成绩排序 - 杨源鑫的个人空间 - OSCHINA - 中文开源技术交流社区...

    题目描述 查找和排序 题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩 都按先录入排列在前的规则处理. 例示: jack 70 peter 96 Tom 70 smit ...

  4. python计算等额本金_等额本金-逆推 - tedzheng的个人空间 - OSCHINA - 中文开源技术交流社区...

    等额本金是递归逆推的一个方法: 父亲准备4年的生活费,使且整存零取的方式,控制每月底只能提取1000元,假设银行年利息为1.71% 思路: 第48个月取出1000,则要先求出47个月时银行存款的具体金 ...

  5. 个推mastersecret_tp5 整合 个推 - osc_w1w21kiw的个人空间 - OSCHINA - 中文开源技术交流社区...

    namespace getui;classGeTui {private $host = 'http://sdk.open.api.igexin.com/apiex.htm';//测试 private ...

  6. 第39级台阶回溯算法c语言,五大经典算法之回溯法 - osc_9ipdey7e的个人空间 - OSCHINA - 中文开源技术交流社区...

    一.基本概念 回溯法,又称为试探法,按选优条件向前不断搜索,以达到目标.但是当探索到某一步时,如果发现原先选择并不优或达不到目标,就会退回一步重新选择,这种达不到目的就退回再走的算法称为回溯法. 与穷 ...

  7. C语言十个字母用冒泡法排序,冒泡排序法(C语言) - osc_wq8j2a9a的个人空间 - OSCHINA - 中文开源技术交流社区...

    常用的排序方法有冒泡排序法,选择排序法,插入排序法以及希尔排序法等.本文着重讲解如何利用C代码,实现冒泡排序. 首先,要了解什么是冒泡排序.冒泡排序是常用的一种排序方法,其基本方法就是逐次比较.即一次 ...

  8. linux冒泡算法程序,用蛮力法解决冒泡排序 - linux-tao的个人空间 - OSCHINA - 中文开源技术交流社区...

    冒泡排序是蛮力法的另一个经典体现. 算法思想:比较列表中相邻的元素,如果是逆序的话,就交换他们的位置.重复多次之后,最大的元素就排到了最后一个位置.第二遍操作将第二个元素排到了倒数第二个位置上,这样一 ...

  9. c语言输出法雷序列,法雷(法里)序列 - osc_h0wb1wlt的个人空间 - OSCHINA - 中文开源技术交流社区...

    定义: 对任意给定的一个自然数n,将分母小于等于n的不可约的真分数按升序排列,并且在第一个分数之前加上0/1,在最后一个分数之后加上1/1,这个序列称为n级法雷数列,即法雷数列是0和1之间最简分数升序 ...

最新文章

  1. 招聘 | B站前端架构师(直播)
  2. 20140710文安c++面试总结
  3. 详解C++移动语义std::move()
  4. 《You Only Look Once: Unified, Real-Time Object Detection》YOLO一种实时目标检测方法 阅读笔记(未完成版)
  5. 我的电脑不联网,很安全!黑客:你还有风扇呢
  6. 基于ASP.NET的新闻管理系统(三)代码展示
  7. 深入理解和应用display属性(一)
  8. python在不同层级目录import模块的方法
  9. System.gc()与Object.finalize()的区别
  10. 防备电脑死机故障技巧的8个方法
  11. 【转】三层架构的业务逻辑层存在的意义
  12. python 战舰_在python中的战舰游戏
  13. iOS--通过assetURL获取到视频
  14. js控制的回到顶端goTop的使用
  15. 【译】eBPF 概述:第 4 部分:在嵌入式系统运行
  16. Mybatis-Plus 新手入门,一篇足以
  17. dwc_pcie iip 代码分析
  18. 如何在Windows中创建新用户?
  19. redis的三种特殊数据类型
  20. Elasticsearch之分词器查询分词效果

热门文章

  1. 如何进行系统的架构设计?
  2. LabVIEW如何减少下一代测试系统中的硬件过时6
  3. Linux 文件属性与权限
  4. mysql 的capi预处理
  5. 设计模式 —— 装饰模式
  6. android源代码目录详解
  7. Unity人工智能编程精粹学习笔记 AI角色的复杂决策——行为树
  8. ASP.NET Core与ASP.NET区别
  9. 开箱一款高精度智能手表,健康监测运动记录,你来评评是否值得
  10. 10分钟内在windows下安装woocommerce开发测试环境