c语言递归练习
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
dic递归基础练习题:
1.求1+2+3+……+n的值
int sum(int a,int b)
{
if(b==a) return a;
return a+sum(a+1,b);
}
2. 求1*2*3*……*n的值
cheng(int begin,int end)
{
if(begin==end) return begin;
return begin * cheng(begin+1,end);
}
3. 数的全排列问题。将n个数字1,2,…n的所有排列按字典顺序枚举出猴
2 3 1
2 1 3
3 1 2
3 2 1
4. 数的组合问题。从1,2,…,n中取出m个数,将所有组合按照字典顺序列出。
如n=3,m=2时,输出:
1 2
1 3
2 3
5. 小猴子第一天摘下若干桃子,当即吃掉一半,又多吃一个.第二天早上又将剩下的桃子吃一半,又多吃一个.以后每天早上吃前一天剩下的一半另一个.到第10天早上猴子想再吃时发现,只剩下一个桃子了.问第一天猴子共摘多少个桃子?
fruit(int begin,int times)
{
if(times==10) return begin;
return fruit((begin+1)*2,times+1);
}
6. 有雌雄一对兔子,假定过两个月便可繁殖雌雄各一的一对小兔子。问过n个月后共有多少对兔子?
7. 一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?
duck(int begin,int times)
{
if(times==7) return begin;
return duck((begin+1)*2,times+1);
}
8.著名的菲波拉契(Fibonacci)数列,其第一项为0,第二项为1,从第三项开始,其每一项都是前两项的和。编程求出该数列前N项数据。
int fbi(int i)
{
if(i<2)
{
if(i == 0) return 0;
else return 1;
}
return fbi(i-1) +fbi(i-2);
}
9. 求两个数的最大公约数。
fgongyue(int m,int n)//m要大于n,前面可以交换让它实现
{
if(n == 0) return m;
fgongyue(n,m%n);
}
10. 求两个数的最小公倍数。
最小公倍数等于2个数之积乘最好公约数
m*n/fgongyue(m,n)
11. 输入一个数,求这个数的各位数字之和。
add_every_num(int num)
{
if(num<10) return num;
return num%10+add_every_num(num/10);
}
12. 角谷定理。输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。经过如此有限次运算后,总可以得到自然数值1。求经过多少次可得到自然数1。
如:输入22,
输出 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
STEP=16
#include "stdafx.h"
#include "stdio.h"
int i = 1;
int fc(int n)
{
if(n == 1)
{
printf("%d",n);
return i;
}
else if(n%2 == 0)
{
printf("%d\t",n);
fc(n/2);
i++;
}
else
{
printf("%d\t",n);
fc(n*3+1);
i++;
}
}
int main(int argc, char* argv[]) {
int n,step;
printf("Please input the num:");
scanf("%d",&n);
step = fc(n);
printf("\nStep = %d\n",step);
return 0;
}
13.将十进制转换为二进制。
#include "stdafx.h"
#include "stdio.h"
int fc(int num)
{
if(num == 1)
{
printf("%d",num);
return 0;
}
fc(num/2);
printf("%d",num%2);
}
int main(int argc, char* argv[]) {
int num;
printf("please input the num:");
scanf("%d",&num);
fc(num);
printf("\n");
return 0;
}
14. 计算M=max(a,b,c)/[max(a+b,b,c)*max(a,b,b+c)],其中a,b,c由键盘输入。skip
15. 梯有N阶,上楼可以一步上一阶,也可以一次上二阶。编一个程序,计算共有多少种不同的走法。
return 1+(fc(n-1)+fc(n-2)
16. 某人写了n封信和n个信封,如果所有的信都装错了信封。求所有的信都装错信封共有多少种不同情况?
17. 给出一棵二叉树的中序与后序排列。求出它的先序排列。
18. 求把一个整数n无序划分成k份互不相同的正整数之和的方法总数。
19. 已知一个一维数组A[1..N]。{N<50} 又已知一整数M。如能使数组A中任意几个元素之和等于M,则输出YES,反之则为NO。
20. 要求找出具有下列性质的数的个数(包含输入的自然数n):
先输入一个自然数n(n<=500),然后对此自然数按照如下方法进行处理:
①. 不作任何处理;
②. 在它的左边加上一个自然数,但该自然数不能超过原数首位数字的一半;
③. 加上数后,继续按此规则进行处理,直到不能再加自然数为止.
样例: 输入: 6
满足条件的数为 6
16
26
126
36
136
输出: 6
21. 自然数的拆分问题。给定自然数n,将其拆分成若干自然数的和。输出所有解,每组解中数字按从小到大排列。相同数字的不同排列算一组解。如:
3=1+1+1
3=1+2
3=3
22. 用递归的方法求N个数中最大的数及其位置。
23. 写出折半查找的递归算法。
24. 快速排序法。
思考题 :
1、数学宝塔,从最顶上走到最底层,每次只能走到下一层的左边或右边的数字,求出使所走到的所有数字之和为60的途径。
7