本文地址:http://www.cnblogs.com/archimedes/p/recursive-practice.html,转载请注明源地址。

1、炮弹一样的球状物体,能够堆积成一个金字塔,在顶端有一个炮弹,它坐落在一个4个炮弹组成的层面上,而这4个炮弹又坐落在一个9个炮弹组成的层面上,以此类推。写一个递归函数CannonBall,这个函数把金字塔的高度作为参数,并且返回它所包括的炮弹数量。函数必须按照递归方式实现,不可以使用迭代结构,例如while或for。

  1. #include<stdio.h>
  2. int CannonBall(int h)
  3. {
  4. if(h == ) return ;
  5. else
  6. return CannonBall(h-) + pow(h,);
  7. }
  8. int main(void)
  9. {
  10. printf("%d\n",CannonBall());
  11. return ;
  12. }

2、使用C编写一个指数函数,实现n^k

  1. #include<stdio.h>
  2. int RaiseToPower(int n, int k)
  3. {
  4. if(k == )
  5. return ;
  6. else
  7. return n * RaiseToPower(n,k -);
  8. }
  9.  
  10. int main()
  11. {
  12. printf("%d\n",RaiseToPower(,));
  13. return ;
  14. }

3、使用欧几里得公式写一个递归函数gcd(m,n),用来计算m与n的最大公约数.

  1. #include<stdio.h>
  2. int gcd(int m, int n)
  3. {
  4. if(m % n ==)
  5. return n;
  6. else
  7. return gcd(n,m % n);
  8. }
  9.  
  10. int main()
  11. {
  12. printf("%d\n",gcd(,));
  13. return ;
  14. }

4、写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和,例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19

  1. #include<stdio.h>
  2. int DigitSum(int n)
  3. {
  4. if(n < )
  5. return n;
  6. else
  7. return ((n % ) + DigitSum(n / ));
  8. }
  9.  
  10. int main()
  11. {
  12. printf("%d\n",DigitSum());
  13. return ;
  14. }

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),返回参数的根,注意:写一个纯粹的、不使用任何循环结构的递归函数。

  1. #include<stdio.h>
  2. int DigitSum(int n)
  3. {
  4. if(n < )
  5. return n;
  6. else
  7. return ((n % ) + DigitSum(n / ));
  8. }
  9.  
  10. int DigitalRoot(int n)
  11. {
  12. if(n < )
  13. return n;
  14. else
  15. return DigitalRoot(DigitSum(n));
  16. }
  17.  
  18. int main()
  19. {
  20. printf("%d\n",DigitalRoot());
  21. return ;
  22. }

6、计算组合数C(n,k)

  1. #include<stdio.h>
  2. int Comb(int n, int k)
  3. {
  4. if(k == || n == k)
  5. return ;
  6. else
  7. return (Comb(n - ,k - ) + Comb(n - ,k));
  8. }
  9.  
  10. int main()
  11. {
  12. int i;
  13. for(i = ; i <= ; i++)
  14. {
  15. printf("%d ",Comb(,i));
  16. }
  17. printf("\n");
  18. return ;
  19. }

7、将一个整数作为字符串打印

  1. #include<stdio.h>
  2. void printd(int n)
  3. {
  4. if(n < ) {
  5. putchar('-');
  6. n = -n;
  7. }
  8. if(n / )
  9. printd(n / );
  10. putchar(n % + '');
  11. }
  12.  
  13. int main()
  14. {
  15. int a = ;
  16. printd(a);
  17. printf("\n");
  18. return ;
  19. }

8、运用上面printd函数的设计思想编写一个递归版本的itoa函数,即通过递归函数把整数变为字符串

  1. #include<stdio.h>
  2. void itoa(int n, char *s)
  3. {
  4. static int i;
  5. if(n / )
  6. itoa(n / , s);
  7. else {
  8. i = ;
  9. if(n < )
  10. s[i++] = '-';
  11. }
  12. s[i++] = abs(n) % + '';
  13. s[i] = '\0';
  14. }
  15.  
  16. int main()
  17. {
  18. char s[];
  19. int n = ;
  20. itoa(n, s);
  21. printf("%s\n",s);
  22. return ;
  23. }

9、编写一个递归版本的reverse(s)函数,以将字符串s转置

  1. #include<stdio.h>
  2. void reverser(char *s, int i, int len)
  3. {
  4. int c, j;
  5. j = len - (i + );
  6. if(i < j) {
  7. c = s[i];
  8. s[i] = s[j];
  9. s[j] = c;
  10. reverser(s, ++i, len);
  11. }
  12. }
  13.  
  14. void reverse(char *s)
  15. {
  16. int len;
  17. len = strlen(s);
  18. reverser(s, , len);
  19. }
  20.  
  21. int main()
  22. {
  23. char s[];
  24. gets(s);
  25. reverse(s);
  26. printf("%s\n",s);
  27. return ;
  28. }

10、二分查找

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<stdbool.h>
  4.  
  5. int *binary_search(int val, int array[], int n)
  6. {
  7. int m = n / ;
  8. if(n <= ) return NULL;
  9. if(val == array[m]) return array + m;
  10. if(val < array[m]) return binary_search(val, array, m);
  11. else return binary_search(val, array + m + , n - m - );
  12. }
  13.  
  14. int main()
  15. {
  16. int n;
  17. int *p;
  18. int a[] = {,,,,,};
  19. while(~scanf("%d", &n)){
  20. p = binary_search(n, a, );
  21. if(p) {
  22. printf("this number is in the array at position %d\n", p - a);
  23. } else {
  24. printf("this number is not in the array\n");
  25. }
  26. }
  27. return ;
  28. }

递归练习(C语言)的更多相关文章

  1. 关于单链表的增删改查方法的递归实现(JAVA语言实现)

    因为在学习数据结构,准备把java的集合框架底层源码,好好的过一遍,所以先按照自己的想法把单链表的类给写出来了; 写该类的目的: 1.练习递归 2.为深入理解java集合框架底层源码打好基础 学习的视 ...

  2. 八皇后问题 递归实现 C语言 超详细 思路 基础

    八皇后问题 :假设 將八个皇后放到国际象棋盘上,使其两两之间无法相互攻击.共有几种摆法? 基础知识: 国际象棋里,棋盘为8X8格. 皇后每步可以沿直线.斜线 走任意格. 思路: 1.想把8个皇后放进去 ...

  3. 求字符串长度之递归与非递归的C语言实现

    在上一篇中介绍了字符串拷贝的递归与非递归的实现,这里就不在赘述递归原理. 递归求字符串长度_strlen: 1 int _strlen(const char *src) 2 { 3 if( src = ...

  4. 字符串拷贝函数递归与非递归的C语言实现

    初学递归的时候,觉得很抽象,不好分析,确实如此,尤其是有些时候控制语句不对,导致程序进去无限次的调用,更严重的是栈溢出.既要正确的控制结束语句,又要有正确的进入下次递归的语句,还要有些操作语句.... ...

  5. 二叉树的建立与递归遍历C语言版

    </pre><pre name="code" class="cpp">#include <stdio.h> #include ...

  6. 兔子生娃问题---函数递归应用--c语言实现

    事情是这样的:在很久很久以前....有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 兔子的规律为数列:1, 1 ...

  7. Atitit 表达式原理 语法分析 原理与实践 解析java的dsl  递归下降是现阶段主流的语法分析方法

    Atitit 表达式原理 语法分析 原理与实践 解析java的dsl  递归下降是现阶段主流的语法分析方法 于是我们可以把上面的语法改写成如下形式:1 合并前缀1 语法分析有自上而下和自下而上两种分析 ...

  8. 分形几何算法和实现(C语言)

    初识分形 1.分形的含义: 英文单词Fractal,它是由美籍法国数学家曼德勃罗(Benoit Mandelbrot)创造出来的.其含义是不规则的.破碎的.分数的.曼德勃罗是想用此词来描述自然界中传统 ...

  9. 部分博文目录索引(C语言+算法)

    今天将本博客的部分文章建立一个索引,方便大家进行阅读,当然每一类别中的文章都会持续的添加和更新(PS:博文主要使用C语言) 博客地址:http://www.cnblogs.com/archimedes ...

随机推荐

  1. 【转载】CSS 盒子模型

    转处:http://www.cnblogs.com/sunyunh/archive/2012/09/01/2666841.html 说在Web世界里(特别是页面布局),Box Model无处不在.下面 ...

  2. 【MVC 过滤器的应用】ASP.NET MVC 如何统计 Action 方法的执行时间

    代码如下: using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; u ...

  3. DDD:聊天笔记

    聚合跟和实体 聚合根是实体. 实体有生命周期,使用标识进行跟踪. 聚合根是全局标识,由仓储或其它服务负责其生命周期. 实体是局部标识,由聚合根负责其生命周期. 为什么能应对复杂度? 纵向.横向.时间维 ...

  4. 使用 PSD Validator 在线校验 PSD 文件的质量

     PSD Validator 可以帮助你在线校验 PSD 文件的质量,使用的规则来自 Photoshop Etiquette.Photoshop Etiquette 整理了 PSD 文件的规范,例如删 ...

  5. OpenGL开发环境配置-Windows/MinGW/Clion/CMake

    因为某些原因,不想用过于臃肿的VS了,转而使用常用的jetbrains的CLion,Clion沿袭了jetbrans的优良传统,基本代码提示功能还是比较好的,不过就是对于windows不熟悉cmake ...

  6. 自动化运维工具之 Ansible 介绍及安装使用

    一.初识Ansible 介绍: Absible 使用 模块(Modules)来定义配置任务.模块可以用标准脚本语言(Python,Bash,Ruby,等等)编写,这是一个很好的做法,使每个模块幂等.A ...

  7. 文本溢出text-overflow

    文本溢出text-overflow 问题:有一个新闻标题,标题宽度为200px,文字为宋体,加粗,文字大小为16px,颜色为黑色,行高为25px,要求单行显示,并且超出时显示“…”,请按要求完成效果. ...

  8. sql语句查询数据库表结构信息

    开发中经常用到查询指定表及其字段的信息,以下是我整理的SQL语句查询方法,供自己平时使用也提供给大家参考! 1.适用MS SQL SERVER: SELECT 表名 = then d.name els ...

  9. mysql线上一些隐患查询sql

    开发写了几个语句,觉得查询结果跟逻辑有点不相符,就拿到这里一起分析了下. 语句如下: select tp.title, tp.amount, ifnull( ) as aInvestAmount, i ...

  10. Week4 结对编程

    1.照片 1.1  结对编程参与者:李文涛.黎柏文 1.2  展示照片 2.结对编程的优点&缺点 2.1 优点 2.1.1.两人分工合作,减少了工作量 2.1.2.结对编程的伙伴往往能提供不同 ...