C语言——递归练习
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 ;
- }
http://www.cnblogs.com/archimedes/p/recursive-practice.html
C语言——递归练习的更多相关文章
- c语言递归讲解分析
C语言允许函数调用它自己,这种调用的过程称为"递归(recursion)" 举例说明,如下代码: #include <stdio.h> void up_and_down ...
- C语言递归,非递归实现翻转链表
翻转链表作为,链表的常用操作,也是面试常遇到的. 分析非递归分析: 非递归用的小技巧比较多,很容易出错. 递归分析比较简单,在代码里面 代码: #include<stdio.h> #inc ...
- 汉诺塔(河内塔)算法 ----C语言递归实现
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子, 在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺 ...
- C语言---递归反向输出任意长度的字符串
(该字符串可以包含空格和回车!) [题目要求] 编写一个递归函数,实现将输入的任意长度的字符串反向输出的功能. 例如输入字符串:ABCD,输出字符串:DCBA. [题目分析] 应用递归的思想有时可以很 ...
- C语言递归回溯法迷宫求解
本例将随机产生一个10*10的迷宫输出后,在下面输出此迷宫的解法. 解法为从坐标(1,1)处进入,从(8,8,)出去,优先线路为先右后下再上最后为左. 不少人求解此题时运用的栈的相关知识,本例寻找线路 ...
- C语言递归实现二叉树(二叉链表)的三种遍历和销毁操作(实验)
今天写的是二叉树操作的实验,这个实验有三个部分: ①建立二叉树,采用二叉链表结构 ②先序.中序.后续遍历二叉树,输出节点值 ③销毁二叉树 二叉树的节点结构定义 typedef struct BiTNo ...
- C语言 递归 汉诺塔问题 最大公约数问题
函数不能嵌套定义,但能嵌套调用(在调用一个函数的过程中再调用另一个函数) 函数间接或直接调用自己,称为递归调用 汉诺塔问题 思想:简化为较为简单的问题 n=2 较为复杂的问题,采用数学归纳方法分析 ...
- 理解C语言递归up_and_down
函数调用.理解递归 对于程序,编译器会对其分配一段内存,在逻辑上可以分为代码段,数据段,堆,栈. 代码段:保存程序文本,指令指针EIP就是指向代码段,可读可执行不可写 数据段:保存初始化的全局变量和静 ...
- C语言 · 递归求二项式系数值
算法训练 6-1 递归求二项式系数值 时间限制:10.0s 内存限制:256.0MB 问题描述 样例输入 一个满足题目要求的输入范例.3 10 样例输出 与上面的样例输入对应的输出. ...
随机推荐
- Google不做坏事吗?
说中国足球为什么冲不出亚洲,那是因为咱中国人太文气,足球是种“斗牛士”式的游戏,得玩的有点儿“野蛮”色彩.记得以前在英国的时候,遇上联赛,晚上大街小巷全民皆兵,曼切斯特队的粉丝在街道一边酒吧里,利物浦 ...
- WCF入门(五)---创建WCF服务
使用Microsoft Visual Studio2012创建WCF服务,理解如下所有必要的编码,更好地创建WCF服务的概念,这里做一个简单的任务. 启动Visual Studio 2012. 单击新 ...
- C++:友元(非成员友元函数、成员友元函数、友元类)
3.8 友元:友元函数和友元类 友元函数 :既可以是不属于任何类的非成员函数,也可以是另一个类的成员函数,统称为友元函数.友元函数不是当前类的成员函数,而是独立于类的外部函数,但它可以访问该类所有的 ...
- Javaweb实现的优优图书商城(含源码)
原文地址:http://www.cnblogs.com/liaoyu/p/uushop.html 源码地址:https://github.com/liaoyu/uushop 贴出一个大学时做的小项目, ...
- Android ActionBar中的下拉菜单
在ActionBar中添加下拉菜单,主要有一下几个关键步骤: 1. 生成一个SpinnerAdapter,设置ActionBar的下拉菜单的菜单项 2. 实现ActionBar.OnNavigatio ...
- MyEclipse 从数据库反向生成Hibernate实体类
第一个大步骤 window-->open Perspective-->MyEclipse Java Persistence 进行了上面的 操作后会出现一个视图DB Brower:MyEcl ...
- linux系统的文件类型学习
linux是一个文件型操作系统,在linux下一切皆文件. 目录.字符设备.块设备.管道.套接字.符号连接文件等在linux下统统都是文件. linux下的文件类型分为以下几种类型: 1. 正规文件, ...
- 自定义View(4)Canvas和Paint常用绘制函数
画布Canvas 在Android下进行2D绘图需要Canvas类的支持,它位于"android.graphics.Canvas"包下,直译过来为画布的意思,用于完成在View上的 ...
- uva12034Race
递推,组合. 考虑第一名有i个人,则f[n]=sum(C(n,i)*f[n-i]),递推即可.. #include<cstdio> #include<algorithm> #i ...
- UVa 11389 (贪心) The Bus Driver Problem
题意: 有司机,下午路线,晚上路线各n个.给每个司机恰好分配一个下午路线和晚上路线. 给出行驶每条路线的时间,如果司机开车时间超过d,则要付加班费d×r. 问如何分配路线才能使加班费最少. 分析: 感 ...