C_关于递归算法的几个例子
1.递归算法的定义:

2.递归与迭代的优劣

eg1:斐波那契数列:斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=1,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)
/*
斐波那契数列 迭代实现 (打印出前40个)
*/
#include <stdio.h>
int main(){
int i, arr[];
arr[] = ;
arr[] = ;
printf("%d %d ",arr[],arr[]);
for(i=; i<; i++){
arr[i] = arr[i-] + arr[i-];
printf("%d ",arr[i]);
}
printf("\n"); return ; }
/*
斐波那契数列 递归实现 (打印出前40个)
*/
#include <stdio.h>
/*
int fb(int n){
if(n == 0){
return 0;
}else if(n == 1){
return 1;
}else{
return fb(n-1) + fb(n-2);
}
}
*/ int fb(int n){
if(n<){
return n == ? :;
}else{
return fb(n-) + fb (n-);
} } int main(){
int i;
for(i=; i<; i++){
printf("%d ",fb(i));
}
printf("\n"); return ;
}
eg2:阶乘:亦即n!=1×2×3×...×n。阶乘亦可以递归方式定义:0!=1,n!=(n-1)!×n。
/*
递归实现阶乘
递归方式定义:0!=1,n!=(n-1)!×n。
*/ #include <stdio.h>
int fact(n){
if(n == ){
return ;
}else{
return fact(n-) * n;
}
} int main(){
int n = ;
printf("%d\n",fact(n));
return ;
}
eg3:

#include <stdio.h>
int print(){
char a;
scanf("%c", &a);
if(a != '#'){
print();
}
if(a != '#'){
printf("%c",a);
}
return ;
}
int main(){
print();
printf("\n");
return ;
}
解题思路:

eg4:二分法查找
/*
二分法查找:迭代实现
*/
#include <stdio.h>
int main(){
int arr[] = {,,,,,,,,,};
int input, low, high, mid;
low = ;
high = ;
mid = (low + high) / ;
scanf("%d", &input); while(input != arr[mid]){
if(input < arr[mid]){
high = mid;
mid = (low + high) / ;
}else{
low = mid;
mid = (low + high) / ;
}
}
printf("%d ",mid);/*输出要查找数字在数组中的下标*/
return ; }
/*
二分法查找:递归实现
*/ #include <stdio.h>
int fun(int low, int high, int input, int arr[]){
int mid;
mid = (low + high) /;
if(arr[mid] == input){
return mid;
}else{
if(input < arr[mid]){
high = mid;
return fun( low, high, input, arr);
}else{
low = mid;
return fun( low, high, input, arr);
}
} }
int main(){
int arr[] = {,,,,,,,,,};
int input, low, high;
low = ;
high = ;
scanf("%d", &input);
printf("%d \n",fun(low, high, input, arr));/*输出要查找数字在数组中的下标*/
return ;
}
C_关于递归算法的几个例子的更多相关文章
- JAVA递归算法及经典递归例子 对于这个汉诺塔问题
前言:递归(recursion):递归满足2个条件 1)有反复执行的过程(调用自身) 2)有跳出反复执行过程的条件(递归出口) 第一题:汉诺塔 对于这个汉诺塔问题,在写递归时,我们只需要确定两个条件: ...
- c 递归函数浅析
所谓递归,简而言之就是应用程序自身调用自身,以实现层次数据结构的查询和访问. 递归的使用可以使代码更简洁清晰,可读性更好(对于初学者到不见得),但由于递归需要系统堆栈,所以空间消耗要比非递归代码要大很 ...
- 归并排序python实现
归并排序python实现 归并排序 归并排序在于把序列拆分再合并起来,使用分治法来实现,这就意味这要构造递归算法 首先是一个例子 原序先通过一半一半的拆分,然后: 然后再一步一步的向上合并,在合并的过 ...
- Master定理学习笔记
前言 \(Master\)定理,又称主定理,用于程序的时间复杂度计算,核心思想是分治,近几年\(Noip\)常考时间复杂度的题目,都需要主定理进行运算. 前置 我们常见的程序时间复杂度有: \(O(n ...
- 如何计算一个字符串表示的计算式的值?——C_递归算法实现
在<C程序设计伴侣>的8.7.3 向main()函数传递数据这一小节中,我们介绍了如何通过main()函数的参数,向程序传递两个数据并计算其和值的简单加法计算器add.exe.这个程序,好 ...
- 第二篇、C_递归算法
简介: 在实际应用当中,我们常常会接触到一些递归的数法. 递归算法的特点 递归算法是一种直接或者间接地调用自身算法的过程.在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简 ...
- Kernel Methods (1) 从简单的例子开始
一个简单的分类问题, 如图左半部分所示. 很明显, 我们需要一个决策边界为椭圆形的非线性分类器. 我们可以利用原来的特征构造新的特征: \((x_1, x_2) \to (x_1^2, \sqrt 2 ...
- C语言数据结构----递归的应用(斐波拉契数列、汉诺塔、strlen的递归算法)
本节主要说了递归的设计和算法实现,以及递归的基本例程斐波拉契数列.strlen的递归解法.汉诺塔和全排列递归算法. 一.递归的设计和实现 1.递归从实质上是一种数学的解决问题的思维,是一种分而治之的思 ...
- (转)递归算法的时间复杂度终结篇与Master method
开篇前言:为什么写这篇文章?笔者目前在学习各种各样的算法,在这个过程中,频繁地碰到到递归思想和分治思想,惊讶于这两种的思想的伟大与奇妙的同时,经常要面对的一个问题就是,对于一个给定的递归算法或者用分治 ...
随机推荐
- [POI2007]堆积木Klo
题解: dp定义方程的时候 好像也不能都用前一个来递推..这样就不能优化了 这题看了题解才想出来... 还是很简单的啊.... 我们定义f[i]表示前i个最大收益 那么j要能从i转移就得满足a[i]- ...
- 【BZOJ3252】攻略
题解: 首先贪心的会发现我们每次一定会选当前权值和最大的那个 然后在于怎么维护这个最大值 我们发现每个修改实际上是对沿途所有点的子树的修改 所以用线段树维护就可以了.. 另外注意有重复部分,但一定是包 ...
- pandas处理finance.yahoo股票数据 WTI CL USO OIL
1.参考 用Python做科学计算-基础篇 »matplotlib-绘制精美的图表 »快速绘图 使用pyplot模块绘图 2.数据来源 CL USO OIL 3.代码 #encoding='utf-8 ...
- 【Android】让Python在Android系统上飞一会儿
第一节 在手机上配置Python运行环境 1.下载和安装 Scripting Layer for Android (SL4A) Scripting Layer for Android (SL4A) 是 ...
- Linux 记录所有用户登录和操作的详细日志
1.起因 最近Linux服务器上一些文件呗篡改,想追查已经查不到记录了,所以得想个办法记录下所有用户的操作记录. 一般大家通常会采用history来记录,但是history有个缺陷就是默认是1000行 ...
- JS uint8Array转String
Uint8Array转字符串 function Uint8ArrayToString(fileData){ var dataString = ""; ; i < fileDa ...
- python---初始sqlite3
***sqllite不需要单独安装,python2.5以上自带的! ***官方中文文档:https://docs.python.org/2/library/sqlite3.html ***SQLite ...
- Ubuntu18.04上安装Docker-Compose
1.进入https://github.com/docker/compose/releases 查看最新版本,当前版本为1.23.1 sudo curl -L https://github.com/do ...
- day33 网络编程之线程,并发以及selectors模块io多路复用
io多路复用 selectors模块 概要: 并发编程需要掌握的知识点: 开启进程/线程 生产者消费者模型!!! GIL全局解释器锁(进程与线程的区别和应用场景) 进程池线程池 IO模型(理论) 1 ...
- BroadcastReceiver工作原理
--摘自<android插件化开发指南> 1.动态注册过程是注册Receiver并通知AMS,发送内容包括IntentFilter.一个实现了IIntentReceiver接口的Binde ...