C语言递归练习
2013-10-02 16:44
253 查看
1、炮弹一样的球状物体,能够堆积成一个金字塔,在顶端有一个炮弹,它坐落在一个4个炮弹组成的层面上,而这4个炮弹又坐落在一个9个炮弹组成的层面上,以此类推。写一个递归函数CannonBall,这个函数把金字塔的高度作为参数,并且返回它所包括的炮弹数量。函数必须按照递归方式实现,不可以使用迭代结构,例如while或for。
2、使用C编写一个指数函数,实现n^k
3、使用欧几里得公式写一个递归函数gcd(m,n),用来计算m与n的最大公约数.
4、写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和,例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19
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),返回参数的根,注意:写一个纯粹的、不使用任何循环结构的递归函数。
6、计算组合数C(n,k)
7、将十进制数转换为二进制数:
非递归算法:
递归算法:
int CannonBall(int h) { if(h == 1) return 1; else return CannonBall(h-1) + pow(h,2); } int main(void) { printf("%d\n",CannonBall(4)); return 0; }
2、使用C编写一个指数函数,实现n^k
int RaiseToPower(int n, int k) { if(k == 0) return 1; else return n * RaiseToPower(n,k -1); } int main() { printf("%d\n",RaiseToPower(3,4)); return 0; }
3、使用欧几里得公式写一个递归函数gcd(m,n),用来计算m与n的最大公约数.
int gcd(int m, int n) { if(m % n ==0) return n; else return gcd(n,m % n); } int main() { printf("%d\n",gcd(18,4)); return 0; }
4、写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和,例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19
int DigitSum(int n) { if(n < 10) return n; else return ((n % 10) + DigitSum(n / 10)); } int main() { printf("%d\n",DigitSum(1729)); return 0; }
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),返回参数的根,注意:写一个纯粹的、不使用任何循环结构的递归函数。
int DigitSum(int n) { if(n < 10) return n; else return ((n % 10) + DigitSum(n / 10)); } int DigitalRoot(int n) { if(n < 10) return n; else return DigitalRoot(DigitSum(n)); } int main() { printf("%d\n",DigitalRoot(1729)); return 0; }
6、计算组合数C(n,k)
int Comb(int n, int k) { if(k == 0 || n == k) return 1; else return (Comb(n - 1,k - 1) + Comb(n - 1,k)); } int main() { int i; for(i = 0; i <= 6; i++) { printf("%d ",Comb(6,i)); } printf("\n"); return 0; }
7、将十进制数转换为二进制数:
非递归算法:
void translate(int n) //将10进制转换为8位的二进制 { int a[10]; int i,j; i=0; while(1) { a[i++]=n%2; if(n/2==0) break; n/=2; } i--; for(j=1; j<8-i; j++) { printf("0"); } for(j=i; j>=0; j--) { printf("%d",a[j]); } }
递归算法:
void binary(unsigned long n) { int r; r = n%2; if(n >= 2) binary(n / 2); putchar('0' + r); return; }
相关文章推荐
- C语言递归练习
- 百度2014校招笔试题目题解(更新了第1题的算法,10.9下午)
- C++字符串的使用学习笔记01
- POJ 1260
- 函数调用时的实参为变量时 -- C语言的每条可执行语句最终都将转换成二进制的机器指令
- C++11标准库之Type Traits简介
- 类的sizeof问题
- C语言中restrict关键字学习
- C++中“类”相关知识点汇总
- paip.c++ 宏的展开调试.
- 第一次用c语言编写程序
- C语言strlen, strcpy, strcmp,strcat函数的实现
- c++ delete[]:怎么知道需要释放的空间大小
- proc/c++(一) 快速上手
- C++虚基类(virtual base class)
- C++ 11右值引用
- 【C++第五课】---析构与构析上
- 关于C++ const 的全面总结
- C++11 并发指南三(Lock 详解)
- C++自定义类型的比较常用做法