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
开篇前言:为什么写这篇文章?笔者目前在学习各种各样的算法,在这个过程中,频繁地碰到到递归思想和分治思想,惊讶于这两种的思想的伟大与奇妙的同时,经常要面对的一个问题就是,对于一个给定的递归算法或者用分治 ...
随机推荐
- [转] babel入门基础
背景 babel的官网说babel是下一代的js语法编译器,现在自己也在很多项目中使用了babel,可是自己对babel的认识呢,只停留在从google和别人项目中copy的配置代码上,内心感到很不安 ...
- yum安装Docker及入门使用
一.安装 1.配置yum源 # vim /etc/yum.repos.d/docker.repo [dockerrepo] name=Docker Repository baseurl=https:/ ...
- 【BZOJ1778】[Usaco2010 Hol]Dotp 驱逐猪猡
题解: 网上有一种复杂的方法..好像复杂度并没有优势就没看 定义f[i]表示i的期望经过次数,f[i]=sigma{f[j]*p/q/du[j]}+(i==1); 然后高斯消元就可以了 最后求出来的f ...
- RN错误随笔 - Unable to resolve module 'AccessibilityInfo'
错误信息:.React Native 运行报错:Unable to resolve module 'AccessibilityInfo' 可以看到在 异常的返回的JSON 结构中给出了推荐的解决方法 ...
- MyEclipse 安装插件 Github安装/使用 教程
2016年02月18日 09:45:23 阅读数:4531 本文的目的是 1.在 Myeclipse10.7中 集成Github并使用. 选择的安装方式是:MyEclipse 中设置下文中1后,下载g ...
- AtCoder Regular Contest 082 (ARC082) E - ConvexScore 计算几何 计数
原文链接http://www.cnblogs.com/zhouzhendong/p/8934254.html 题目传送门 - ARC082 E 题意 给定二维平面上的$n$个点,定义全集为那$n$个点 ...
- POJ2676 Sudoku 舞蹈链 DLX
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目(传送门) 题意概括 给出一个残缺的数独,求解.SPJ 题解 DLX + 矩阵构建 (两个传送门) 代码 #includ ...
- Java 异常处理的重要认识
异常类的继承结构 Exception : 一般标识的是程序中出现的问题,可以直接使用try---catch处理. Error : 一般值得是JVM错误,程序中无法处理. 检测异常类需要在throws后 ...
- 阿里 EasyExcel 使用及避坑
github地址:https://github.com/alibaba/easyexcel 原本在项目中使用EasyPoi读取excel,后来为了统一技术方案,改用阿里的EasyExcel.EasyE ...
- 【H5】-- FormData用法介绍以及实现图片/文件上传--【XUEBIG】
一.概述 FormData 对象的使用: 1.用一些键值对来模拟一系列表单控件:即把form中所有表单元素的name与value组装成一个queryString 2. 异步上传二进制文件. 二.使 ...