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语言——递归练习的更多相关文章

  1. c语言递归讲解分析

    C语言允许函数调用它自己,这种调用的过程称为"递归(recursion)" 举例说明,如下代码: #include <stdio.h> void up_and_down ...

  2. C语言递归,非递归实现翻转链表

    翻转链表作为,链表的常用操作,也是面试常遇到的. 分析非递归分析: 非递归用的小技巧比较多,很容易出错. 递归分析比较简单,在代码里面 代码: #include<stdio.h> #inc ...

  3. 汉诺塔(河内塔)算法 ----C语言递归实现

    汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子, 在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺 ...

  4. C语言---递归反向输出任意长度的字符串

    (该字符串可以包含空格和回车!) [题目要求] 编写一个递归函数,实现将输入的任意长度的字符串反向输出的功能. 例如输入字符串:ABCD,输出字符串:DCBA. [题目分析] 应用递归的思想有时可以很 ...

  5. C语言递归回溯法迷宫求解

    本例将随机产生一个10*10的迷宫输出后,在下面输出此迷宫的解法. 解法为从坐标(1,1)处进入,从(8,8,)出去,优先线路为先右后下再上最后为左. 不少人求解此题时运用的栈的相关知识,本例寻找线路 ...

  6. C语言递归实现二叉树(二叉链表)的三种遍历和销毁操作(实验)

    今天写的是二叉树操作的实验,这个实验有三个部分: ①建立二叉树,采用二叉链表结构 ②先序.中序.后续遍历二叉树,输出节点值 ③销毁二叉树 二叉树的节点结构定义 typedef struct BiTNo ...

  7. C语言 递归 汉诺塔问题 最大公约数问题

    函数不能嵌套定义,但能嵌套调用(在调用一个函数的过程中再调用另一个函数) 函数间接或直接调用自己,称为递归调用  汉诺塔问题 思想:简化为较为简单的问题 n=2 较为复杂的问题,采用数学归纳方法分析 ...

  8. 理解C语言递归up_and_down

    函数调用.理解递归 对于程序,编译器会对其分配一段内存,在逻辑上可以分为代码段,数据段,堆,栈. 代码段:保存程序文本,指令指针EIP就是指向代码段,可读可执行不可写 数据段:保存初始化的全局变量和静 ...

  9. C语言 · 递归求二项式系数值

    算法训练 6-1 递归求二项式系数值   时间限制:10.0s   内存限制:256.0MB      问题描述 样例输入 一个满足题目要求的输入范例.3 10 样例输出 与上面的样例输入对应的输出. ...

随机推荐

  1. Git教程之管理修改(6)

    Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件.你会问,什么是修改?比如你新增了一行,这就是一个修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又加了 ...

  2. KMP算法的C++实现

    这个问题阮一峰老师讲的很清楚,链接 这里我只贴一下我的C++实现代码: #include <iostream> #include <cstring> #include < ...

  3. 传感器(2)常用api简介及列出当前设备支持的传感器代码

    Android SDK提供了Android sensor framework,可以用来访问当前Android设备内置的传感器. ASF提供了很多类和接口,可以帮助我们完成各种与传感器有关的任务. 例如 ...

  4. Android开发性能优化大总结

    1.  采用硬件加速,在androidmanifest.xml中application添加android:hardwareAccelerated="true".不过这个需要在and ...

  5. bzoj3747

    经典题,记录每个位置对应数下次出现的位置next[i] 每个位置维护当前左端点下到这个位置的和 随着左端点的右移一位到i+1,对[i+1,next[i]-1] 的影响是-a[i], [next[i], ...

  6. EASYUI+MVC4通用权限管理平台

    通用权限案例平台在经过几年的实际项目使用,并取得了不错的用户好评.在平台开发完成后,特抽空总结一下平台知识,请各位在以后的时间里,关注博客的更新. 1.EASYUI+MVC4通用权限管理平台--前言 ...

  7. codevs 1172 Hankson 的趣味题

    woc....这题考细节处理.要注意代码的逻辑顺序还有不要作死地循环到sqrt+1. #include<iostream> #include<cstdio> #include& ...

  8. OK335xS psplash make-image-header.sh hacking

    /***************************************************************************** * OK335xS psplash mak ...

  9. eclipse 下生成jar包

    eclipse 下生成jar包 第一:普通类导出jar包,我说的普通类就是指此类包含main方法,并且没有用到别的jar包. 1.在eclipse中选择你要导出的类或者package,右击,选择Exp ...

  10. zoj 1842 Prime Distance

    // 数论题,增强的筛法,回想素数筛法 // 只要筛到最大数的开方,剩下的就是素数 // 于是这里,开一个 sqrt(2^31) 大约 65536 的素数表,然后 // 对于每个 L~U 的区间,筛掉 ...