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
开篇前言:为什么写这篇文章?笔者目前在学习各种各样的算法,在这个过程中,频繁地碰到到递归思想和分治思想,惊讶于这两种的思想的伟大与奇妙的同时,经常要面对的一个问题就是,对于一个给定的递归算法或者用分治 ...
随机推荐
- 第k个互质数(二分 + 容斥)
描述两个数的a,b的gcd为1,即a,b互质,现在给你一个数m,你知道与它互质的第k个数是多少吗?与m互质的数按照升序排列. 输入 输入m ,k (1<=m<=1000000;1<= ...
- Python_面向对象_类1
面向对象:减少重复代码,提高效率,比函数式编程更高效 类的创建: 实例属性又称:成员变量,成员属性(或者字段) 面向对象的三大特性: 一.封装 把客观事物封装为抽象的类,并对外只暴露一个可用接口 使用 ...
- Python学习(二十) —— 前端之CSS
转载自http://www.cnblogs.com/liwenzhou/p/7999532.html 一.CSS介绍 CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTM ...
- openstack2 kvm
一.kvm安装 1.首先虚拟机的话需要打开虚拟化功能,服务器的话需要在bios中设置 2.安装kvm用户态管理工具qemu-kvm 和 用来管理kvm虚拟机的插件libvirt和创建虚拟机用的virt ...
- 【目录】《剑指Offer》Java实现
如题: 1) 找出数组中重复的数字 2) 不修改数组找出重复的数字 3) 二维数组中的查找 4) 替换空格 5) 从尾到头打印链表 6) 重建二叉树 7) 二叉树的下一个结点 8) 用两个栈实现队列 ...
- 使用loadrunner录制脚本的思路和注意要点
基本思路如下图: 注意要点有如下几点: 1.性能测试往往需要准备大批量的数据,大批量数据的生成方法有很多种,常见的有: (1)编写SQL语句来插入数据 (2)使用DataFactory等专业的数据生成 ...
- CodeSignal 刷题 —— matrixElementSum
After they became famous, the CodeBots all decided to move to a new building and live together. The ...
- ZOJ 3769-Diablo III(DP)
描述 Diablo III is an action role-playing video game. A few days ago, Reaper of Souls (ROS), the new e ...
- 2501 矩阵距离 (bfs)
描述 给定一个N行M列的01矩阵 A,A[i][j] 与 A[k][l] 之间的曼哈顿距离定义为: dist(A[i][j],A[k][l])=|i-k|+|j-l| 输出一个N行M列的整数矩阵B,其 ...
- POJ 2631 Roads in the North (模板题)(树的直径)
<题目链接> 题目大意:求一颗带权树上任意两点的最远路径长度. 解题分析: 裸的树的直径,可由树形DP和DFS.BFS求解,下面介绍的是BFS解法. 在树上跑两遍BFS即可,第一遍BFS以 ...