递归 从最简单开始 逐步深化的理解 +举例说明 (n的阶乘、斐波那契数列、n个台阶不同走法、蓝桥杯第39级台阶) C++

本文主要是介绍递归 从最简单开始 逐步深化的理解 +举例说明 (n的阶乘、斐波那契数列、n个台阶不同走法、蓝桥杯第39级台阶) C++,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

先看三个拓展题目:

一、求n的阶乘(1<n<1000)?

例如n=5;  5的阶乘:5*4*3*2*1=120

//递归
#include<iostream>
using namespace std;
int fun(int n){if(n==1)return 1;elsereturn n*fun(n-1);
}
int main(){int n;cin>>n;cout<<fun(n);return 0;
}//————————————————————————————————————————————————————————————————————————————————————/*
//非递归
#include<iostream>
using namespace std;
int main(){int n,sum=1;cin>>n;while(n>0)sum*=n--;cout<<sum;return 0;
}
*/

 二、求斐波那契数列的第n项是多少?

斐波那契数列:1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765........

规律:前两个数相加等于后面的第三个数(a[i] = a[i-1] + a[i-2] ,其中i>=3);

//递归
#include<iostream>
using namespace std;
int fun(int n){if(n==0)return 0;else if(n==1)return 1;else return fun(n-1)+fun(n-2);
}
int main(){int n;cin>>n;cout<<fun(n);return 0;
}//——————————————————————————————————————————————————————————————————————————— /*
//非递归 
#include<iostream>
using namespace std;
int main(){int n;cin>>n;int aa[n+1];aa[1]=aa[2]=1;for(int i=3;i<=n;i++)aa[i]=aa[i-1]+aa[i-2]; cout<<aa[n];return 0;
}
*/

三、楼梯有n阶台阶,上楼可以一步上1阶,也可以一步上2阶,编一程序计算共有多少种不同的走法.
设n阶台阶的走法数为f(n),按照倒推法(从楼梯最上面,倒推过来,从n-1台阶到第n台阶的走法,和从n-2到第n台阶的走法),显然有当 n>2 时,f(n)=f(n-1)+f(n-2),(特别关键,一定要理解透彻,最好能自己动笔推演一遍才能真正的搞清楚)

输入一个整数n(3<=n<=1000);

输出一个整数表示共有多少种不同的走法。

#include<iostream>
using namespace std;
int fun(int n){if(1==n)return 1;else if(2==n)return 2;elsereturn fun(n-1)+fun(n-2);
} 
int main(){int n;cin>>n;cout<<fun(n)<<endl;return 0;
}//提示:非递归可用排列组合的方法实现,过程略显复杂,代码省略

(39阶台阶,102334155)

-------------------------------------------------上主菜 -------------------------------------------------------------

四、第39级台阶
小明刚刚看完电影《第39级台阶》,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级!
站在台阶前,他突然又想着一个问题:

如果我每一步 只能迈上1个或2个台阶。先迈左脚,然后左右交替,
最后一步是迈右脚,也就是说共要走偶数步(不同点)

那么,上完39级台阶, 有多少种不同的,上法呢?
请你利用计算机的优势,帮助小明寻找答案。

要求提交的是个整数。
注意:不要提交解答过程,或其它的辅助说明文字。

(答案:51167078)

#include<iostream>
using namespace std;
int ans=0; 
void fun(int step,int s){     //step表示还剩余多少步(台阶),s表示走了多少步,if(step<0)return;else if(0==step &&s%2==0)ans++;else{fun(step-1,s+1);fun(step-2,s+1);}	
} 
int main(){fun(39,0);cout<<ans<<endl;return 0;
}//提示:非递归可用排列组合的方法实现,过程略显复杂,代码省略

非递归:运用排列组合的方法

注:102334155 / 2 = 51167077.5 ==> 51167078

总结:

  • 由一、二可以看出递归不一定就比非递归简单,其实一、二递归算法的效率远远低于非递归,数据稍微大一点就能明显感觉出来,递归要好几秒甚至十多秒才能出答案,非递归却依然还是一两秒就能出答案;
  • 由三、四可以知道:递归对于一些比较复杂问题还是很好用的(要不然怎么说高手都用递归呢),当然,好用基本都只是在于代码量简单了,就是有些废脑子,容易烧坏脑袋;
  • 由这四个递归程序(逐渐复杂)可以很好的帮助理解递归的原理,对递归很困惑的小伙伴很有帮助,值得研究;
  • ………………+++++…………
  • 其他总结,还请有想法的读者能共享出自己的总结经验,大家共同进步。

这篇关于递归 从最简单开始 逐步深化的理解 +举例说明 (n的阶乘、斐波那契数列、n个台阶不同走法、蓝桥杯第39级台阶) C++的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/233357

相关文章

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

深入理解Apache Kafka(分布式流处理平台)

《深入理解ApacheKafka(分布式流处理平台)》ApacheKafka作为现代分布式系统中的核心中间件,为构建高吞吐量、低延迟的数据管道提供了强大支持,本文将深入探讨Kafka的核心概念、架构... 目录引言一、Apache Kafka概述1.1 什么是Kafka?1.2 Kafka的核心概念二、Ka

C++ vector的常见用法超详细讲解

《C++vector的常见用法超详细讲解》:本文主要介绍C++vector的常见用法,包括C++中vector容器的定义、初始化方法、访问元素、常用函数及其时间复杂度,通过代码介绍的非常详细,... 目录1、vector的定义2、vector常用初始化方法1、使编程用花括号直接赋值2、使用圆括号赋值3、ve

如何高效移除C++关联容器中的元素

《如何高效移除C++关联容器中的元素》关联容器和顺序容器有着很大不同,关联容器中的元素是按照关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的,本文介绍了如何高效移除C+... 目录一、简介二、移除给定位置的元素三、移除与特定键值等价的元素四、移除满足特android定条件的元

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下: