递归练习(C语言)
本文地址:http://www.cnblogs.com/archimedes/p/recursive-practice.html,转载请注明源地址。
1、炮弹一样的球状物体,能够堆积成一个金字塔,在顶端有一个炮弹,它坐落在一个4个炮弹组成的层面上,而这4个炮弹又坐落在一个9个炮弹组成的层面上,以此类推。写一个递归函数CannonBall,这个函数把金字塔的高度作为参数,并且返回它所包括的炮弹数量。函数必须按照递归方式实现,不可以使用迭代结构,例如while或for。
#include<stdio.h>
int CannonBall(int h)
{
if(h == ) return ;
else
return CannonBall(h-) + pow(h,);
}
int main(void)
{
printf("%d\n",CannonBall());
return ;
}
2、使用C编写一个指数函数,实现n^k
#include<stdio.h>
int RaiseToPower(int n, int k)
{
if(k == )
return ;
else
return n * RaiseToPower(n,k -);
} int main()
{
printf("%d\n",RaiseToPower(,));
return ;
}
3、使用欧几里得公式写一个递归函数gcd(m,n),用来计算m与n的最大公约数.
#include<stdio.h>
int gcd(int m, int n)
{
if(m % n ==)
return n;
else
return gcd(n,m % n);
} int main()
{
printf("%d\n",gcd(,));
return ;
}
4、写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和,例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19
#include<stdio.h>
int DigitSum(int n)
{
if(n < )
return n;
else
return ((n % ) + DigitSum(n / ));
} int main()
{
printf("%d\n",DigitSum());
return ;
}
5、整数n的数字根是如下定义的:它是一个整数的所有数字的和,反复相加,直到只剩下一位数字为止。例如:1729的digital root按照如下的步骤计算:
step 1: 1+7+2+9 -----> 19
step 2: 1+9 -----> 10
step 3: 1+0 -----> 1
因为第三步的结果是1,所以1就是数字根的值。
写一个函数DigitalRoot(n),返回参数的根,注意:写一个纯粹的、不使用任何循环结构的递归函数。
#include<stdio.h>
int DigitSum(int n)
{
if(n < )
return n;
else
return ((n % ) + DigitSum(n / ));
} int DigitalRoot(int n)
{
if(n < )
return n;
else
return DigitalRoot(DigitSum(n));
} int main()
{
printf("%d\n",DigitalRoot());
return ;
}
6、计算组合数C(n,k)
#include<stdio.h>
int Comb(int n, int k)
{
if(k == || n == k)
return ;
else
return (Comb(n - ,k - ) + Comb(n - ,k));
} int main()
{
int i;
for(i = ; i <= ; i++)
{
printf("%d ",Comb(,i));
}
printf("\n");
return ;
}
7、将一个整数作为字符串打印
#include<stdio.h>
void printd(int n)
{
if(n < ) {
putchar('-');
n = -n;
}
if(n / )
printd(n / );
putchar(n % + '');
} int main()
{
int a = ;
printd(a);
printf("\n");
return ;
}
8、运用上面printd函数的设计思想编写一个递归版本的itoa函数,即通过递归函数把整数变为字符串
#include<stdio.h>
void itoa(int n, char *s)
{
static int i;
if(n / )
itoa(n / , s);
else {
i = ;
if(n < )
s[i++] = '-';
}
s[i++] = abs(n) % + '';
s[i] = '\0';
} int main()
{
char s[];
int n = ;
itoa(n, s);
printf("%s\n",s);
return ;
}
9、编写一个递归版本的reverse(s)函数,以将字符串s转置
#include<stdio.h>
void reverser(char *s, int i, int len)
{
int c, j;
j = len - (i + );
if(i < j) {
c = s[i];
s[i] = s[j];
s[j] = c;
reverser(s, ++i, len);
}
} void reverse(char *s)
{
int len;
len = strlen(s);
reverser(s, , len);
} int main()
{
char s[];
gets(s);
reverse(s);
printf("%s\n",s);
return ;
}
10、二分查找
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h> int *binary_search(int val, int array[], int n)
{
int m = n / ;
if(n <= ) return NULL;
if(val == array[m]) return array + m;
if(val < array[m]) return binary_search(val, array, m);
else return binary_search(val, array + m + , n - m - );
} int main()
{
int n;
int *p;
int a[] = {,,,,,};
while(~scanf("%d", &n)){
p = binary_search(n, a, );
if(p) {
printf("this number is in the array at position %d\n", p - a);
} else {
printf("this number is not in the array\n");
}
}
return ;
}
递归练习(C语言)的更多相关文章
- 关于单链表的增删改查方法的递归实现(JAVA语言实现)
因为在学习数据结构,准备把java的集合框架底层源码,好好的过一遍,所以先按照自己的想法把单链表的类给写出来了; 写该类的目的: 1.练习递归 2.为深入理解java集合框架底层源码打好基础 学习的视 ...
- 八皇后问题 递归实现 C语言 超详细 思路 基础
八皇后问题 :假设 將八个皇后放到国际象棋盘上,使其两两之间无法相互攻击.共有几种摆法? 基础知识: 国际象棋里,棋盘为8X8格. 皇后每步可以沿直线.斜线 走任意格. 思路: 1.想把8个皇后放进去 ...
- 求字符串长度之递归与非递归的C语言实现
在上一篇中介绍了字符串拷贝的递归与非递归的实现,这里就不在赘述递归原理. 递归求字符串长度_strlen: 1 int _strlen(const char *src) 2 { 3 if( src = ...
- 字符串拷贝函数递归与非递归的C语言实现
初学递归的时候,觉得很抽象,不好分析,确实如此,尤其是有些时候控制语句不对,导致程序进去无限次的调用,更严重的是栈溢出.既要正确的控制结束语句,又要有正确的进入下次递归的语句,还要有些操作语句.... ...
- 二叉树的建立与递归遍历C语言版
</pre><pre name="code" class="cpp">#include <stdio.h> #include ...
- 兔子生娃问题---函数递归应用--c语言实现
事情是这样的:在很久很久以前....有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 兔子的规律为数列:1, 1 ...
- Atitit 表达式原理 语法分析 原理与实践 解析java的dsl 递归下降是现阶段主流的语法分析方法
Atitit 表达式原理 语法分析 原理与实践 解析java的dsl 递归下降是现阶段主流的语法分析方法 于是我们可以把上面的语法改写成如下形式:1 合并前缀1 语法分析有自上而下和自下而上两种分析 ...
- 分形几何算法和实现(C语言)
初识分形 1.分形的含义: 英文单词Fractal,它是由美籍法国数学家曼德勃罗(Benoit Mandelbrot)创造出来的.其含义是不规则的.破碎的.分数的.曼德勃罗是想用此词来描述自然界中传统 ...
- 部分博文目录索引(C语言+算法)
今天将本博客的部分文章建立一个索引,方便大家进行阅读,当然每一类别中的文章都会持续的添加和更新(PS:博文主要使用C语言) 博客地址:http://www.cnblogs.com/archimedes ...
随机推荐
- 自定义能够for each的类,C#,Java,C++,C++/cli的实现方法
自定义类能够被for each,应该算是个老生常谈的话题了,相关的资料都很多,不过这里整理总结主流语言的不同实现方式,并比较部分细节上的差异. 第一种语言,也是实现起来最简单的Java语言.在Java ...
- PintJS – 轻量,并发的 GruntJS 运行器
PintJS 是一个小型.异步的 GruntJS 运行器,试图解决大规模构建流程中的一些问题. 典型的Gruntfile 会包括 jsHint,jasmine,LESS,handlebars, ugl ...
- Win10 + VS2015 下编译 Qt5.6.0
近期由于另外一个项目需要用 vs2015 ,于是把 Qt 也升级到了 5.6.0 .由于项目需要兼容 Windows xp ,所以需要自己编译 Qt .这里大致整理一下编译的过程. 安装 Active ...
- .Net魔法堂:史上最全的ActiveX开发教程——开发篇
一.前言 在设计某移动内部自动化运维平台时,经综合考虑终端机性能和功能需求等因素后,决定采用B/S模式,并且浏览器通过ActiveX组件实现与服务器Agent作P2P的通讯.好处,整个平台以网页形式存 ...
- “康园圈--互联网+校园平台“项目之sprint1总结
一.团队成员 梁植淋,官郅豪,纪焓,詹耀海 二.目前进度 在全体组员的努力下,目前完成了项目的<设计方案书>.<功能需求书>.框架搭建.项目部署文档. 并成 ...
- JS 对象属性相关--检查属性、枚举属性等
1.删除属性 delete运算符可以删除对象的属性 delete person.age //即person不再有属性age delete person['age'] //或者这样 delete只是断开 ...
- 计算几何 : 凸包学习笔记 --- Graham 扫描法
凸包 (只针对二维平面内的凸包) 一.定义 简单的说,在一个二维平面内有n个点的集合S,现在要你选择一个点集C,C中的点构成一个凸多边形G,使得S集合的所有点要么在G内,要么在G上,并且保证这个凸多边 ...
- Linq专题之对象初始化器
在C#3.0之前,如果创建一个新的对象,往往需要调用类的构造函数来初始化该对象的值,在c#3.0提供了一个"对象初始化器"的机制,使得开发人员在创建新的对象时不通过调用类的构造函数 ...
- 使用事务操作SQLite数据批量插入,提高数据批量写入速度,源码讲解
SQLite数据库作为一般单机版软件的数据库,是非常优秀的,我目前单机版的软件产品线基本上全部替换Access作为优选的数据库了,在开发过程中,有时候需要批量写入数据的情况,发现传统的插入数据模式非常 ...
- 关于SqlServer2012本地帮助文档安装失败问题
由于本人在前一段时间安装了SqlServer2012,安装后没有自带本地帮助文档,因为新的数据库版本微软捆绑了一个本地帮助文档查看器软件,所以在这个软件里面选择联机安装的时候,总是下载不成功,原因你们 ...