递归练习(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 ...
随机推荐
- 【转载】CSS 盒子模型
转处:http://www.cnblogs.com/sunyunh/archive/2012/09/01/2666841.html 说在Web世界里(特别是页面布局),Box Model无处不在.下面 ...
- 【MVC 过滤器的应用】ASP.NET MVC 如何统计 Action 方法的执行时间
代码如下: using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; u ...
- DDD:聊天笔记
聚合跟和实体 聚合根是实体. 实体有生命周期,使用标识进行跟踪. 聚合根是全局标识,由仓储或其它服务负责其生命周期. 实体是局部标识,由聚合根负责其生命周期. 为什么能应对复杂度? 纵向.横向.时间维 ...
- 使用 PSD Validator 在线校验 PSD 文件的质量
PSD Validator 可以帮助你在线校验 PSD 文件的质量,使用的规则来自 Photoshop Etiquette.Photoshop Etiquette 整理了 PSD 文件的规范,例如删 ...
- OpenGL开发环境配置-Windows/MinGW/Clion/CMake
因为某些原因,不想用过于臃肿的VS了,转而使用常用的jetbrains的CLion,Clion沿袭了jetbrans的优良传统,基本代码提示功能还是比较好的,不过就是对于windows不熟悉cmake ...
- 自动化运维工具之 Ansible 介绍及安装使用
一.初识Ansible 介绍: Absible 使用 模块(Modules)来定义配置任务.模块可以用标准脚本语言(Python,Bash,Ruby,等等)编写,这是一个很好的做法,使每个模块幂等.A ...
- 文本溢出text-overflow
文本溢出text-overflow 问题:有一个新闻标题,标题宽度为200px,文字为宋体,加粗,文字大小为16px,颜色为黑色,行高为25px,要求单行显示,并且超出时显示“…”,请按要求完成效果. ...
- sql语句查询数据库表结构信息
开发中经常用到查询指定表及其字段的信息,以下是我整理的SQL语句查询方法,供自己平时使用也提供给大家参考! 1.适用MS SQL SERVER: SELECT 表名 = then d.name els ...
- mysql线上一些隐患查询sql
开发写了几个语句,觉得查询结果跟逻辑有点不相符,就拿到这里一起分析了下. 语句如下: select tp.title, tp.amount, ifnull( ) as aInvestAmount, i ...
- Week4 结对编程
1.照片 1.1 结对编程参与者:李文涛.黎柏文 1.2 展示照片 2.结对编程的优点&缺点 2.1 优点 2.1.1.两人分工合作,减少了工作量 2.1.2.结对编程的伙伴往往能提供不同 ...