循环可以实现的,递归一定可以实现
递归可以实现的,循环不一定可以实现。
1 费波拉契数列,天梯,兔子繁殖
2 阶乘
3 递增1+2+3+...+n
4 判断整数有多少位
5 判断一个数是否为3的幂,1代表是3的幂,0代表不是
6 十进制转二进制
7 十进制转八进制
8 十进制转十六进制
9 判断一个数组是否升序,降序,等序
10 打印出一个整数的逆序
11 汉诺塔
12 计算1+(1*2)+(1*2*3)+...+(1*2*3*...*n)
13 编写计算m的n次方的递归函数。
14 编一个程序,读入具有5个元素的整型数组,然后调用一个函数,递归计算这些元素的积。
15 编一个程序,读入具有5个元素的实型数组,然后调用一个函数,递归地找出其中的最大元素,并指出它位置。
16 不使用+-*/,计算两个整数之和
17 模拟计算器,输入字符串,计算结果
1 费波拉契数列,天梯,兔子繁殖
有一个天梯,每次只能走1步或者2步,阶梯从0开始计数,现在输入天梯的阶数,求一共有多少种走法。
由于每次只能走1步或者2步,因此在走到第3阶之前,不是从第1阶走2步,就是从第2阶走1步。故第3阶的走法是第1阶的走法加上第2阶的走法的和。如此类推。
兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生成一对小兔子。一年以后可以繁殖多少对兔子呢?
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<windows.h> 5 6 double tencent(int n);//如果数值过大,需要用到double类型 7 8 void main() 9 { 10 int n; 11 12 scanf("%d", &n); 13 14 printf("%f", tencent(n)); 15 16 system("pause"); 17 } 18 19 double tencent(int n)//递归,有返回值,因此有多个return 20 { 21 if (n == 1)//第1阶,1种走法 22 { 23 return 1; 24 } 25 else if (n == 2)//第2阶,2种走法 26 { 27 return 2; 28 } 29 else 30 { 31 return tencent(n - 1) + tencent(n - 2); 32 } 33 }
2 阶乘
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<stdlib.h> 5 6 int fun(int n) 7 { 8 if (n == 1) 9 { 10 return 1; 11 } 12 else 13 { 14 return fun(n - 1)*n; 15 } 16 } 17 18 void main() 19 { 20 int n; 21 22 scanf("%d", &n); 23 24 printf("%d", fun(n)); 25 26 system("pause"); 27 }
3 递增1+2+3+...+n
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<stdlib.h> 5 6 int fun(int n) 7 { 8 if (n == 1) 9 { 10 return 1; 11 } 12 else 13 { 14 return fun(n - 1) + n; 15 } 16 } 17 18 void main() 19 { 20 int n; 21 22 scanf("%d", &n); 23 24 printf("%d", fun(n)); 25 26 system("pause"); 27 }
4 判断整数有多少位
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<stdlib.h> 5 6 int getwei(int num) 7 { 8 if (num < 10) 9 { 10 return 1; 11 } 12 else 13 { 14 return getwei(num / 10) + 1; 15 } 16 } 17 18 void main() 19 { 20 int num; 21 22 scanf("%d", &num); 23 24 printf("%d", getwei(num)); 25 26 system("pause"); 27 }
5 判断一个数是否为3的幂,1代表是3的幂,0代表不是
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<windows.h> 5 6 int mi(int num)//递归,1代表是3的幂,0代表不是 7 { 8 if (num < 1)//如果小于1,不是3的幂 9 { 10 return 0; 11 } 12 else if (num == 1)//3的最小幂是1 13 { 14 return 1; 15 } 16 else 17 { 18 if (num % 3 == 0)//如果是3的倍数,继续除以3,继续递归 19 { 20 return mi(num / 3); 21 } 22 else 23 { 24 return 0; 25 } 26 } 27 } 28 29 void main() 30 { 31 int num; 32 int i; 33 34 scanf("%d", &num); 35 36 printf("%d", mi(num)); 37 38 system("pause"); 39 }
6 十进制转二进制
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<stdlib.h> 5 6 void ten2two(int num) 7 { 8 if (num < 2) 9 { 10 printf("%d", num); 11 } 12 else 13 { 14 ten2two(num / 2); 15 printf("%d", num % 2); 16 } 17 } 18 19 void main() 20 { 21 int num = 2; 22 23 ten2two(num); 24 25 system("pause"); 26 }
7 十进制转八进制
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<stdlib.h> 5 6 void ten2eight(int num) 7 { 8 if (num < 8) 9 { 10 printf("%d", num); 11 } 12 else 13 { 14 ten2eight(num / 8); 15 printf("%d", num % 8); 16 } 17 } 18 19 void main() 20 { 21 int num = 8; 22 23 ten2eight(num); 24 25 system("pause"); 26 }
8 十进制转十六进制
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include <stdio.h> 4 #include <stdlib.h> 5 6 void ten2sixteen(int num) 7 { 8 if (num < 10) 9 { 10 printf("%d", num); 11 } 12 else if (num == 10) 13 { 14 printf("A"); 15 } 16 else if (num == 11) 17 { 18 printf("B"); 19 } 20 else if (num == 12) 21 { 22 printf("C"); 23 } 24 else if (num == 13) 25 { 26 printf("D"); 27 } 28 else if (num == 14) 29 { 30 printf("E"); 31 } 32 else if (num == 15) 33 { 34 printf("F"); 35 } 36 else 37 { 38 ten2sixteen(num / 16); 39 switch (num % 16) 40 { 41 case 0: 42 case 1: 43 case 2: 44 case 3: 45 case 4: 46 case 5: 47 case 6: 48 case 7: 49 case 8: 50 case 9: 51 printf("%d", num % 16); 52 break; 53 case 10: 54 printf("A"); 55 break; 56 case 11: 57 printf("B"); 58 break; 59 case 12: 60 printf("C"); 61 break; 62 case 13: 63 printf("D"); 64 break; 65 case 14: 66 printf("E"); 67 break; 68 case 15: 69 printf("F"); 70 break; 71 } 72 } 73 } 74 75 void main() 76 { 77 int num = 1234; 78 79 ten2sixteen(num); 80 }
9 判断一个数组是否升序,降序,等序
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 #define N 10//数组元素个数 5 int a[N] = { 1,2,3,4,5,6,7,8,9,10 }; 6 7 int isadd(int n)//升序返回1,否则返回0 8 { 9 if (n == 1)//循环到下标1 10 { 11 return a[n - 1] < a[n];//改成>判断降序,改成==判断等序 12 } 13 else 14 { 15 return a[n - 1] < a[n] && isadd(n - 1);//改成>判断降序,改成==判断等序 16 } 17 } 18 19 void main() 20 { 21 printf("%d", isadd(N - 1));//数组的最后一个下标,开始往前循环 22 23 system("pause"); 24 }
10 打印出一个整数的逆序
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 void nixu(int n) 5 { 6 if (n < 10) 7 { 8 printf("%d", n); 9 } 10 else 11 { 12 printf("%d", n % 10); 13 nixu(n / 10); 14 } 15 } 16 17 void main() 18 { 19 int num = 123456; 20 21 nixu(num); 22 23 system("pause"); 24 }
11 汉诺塔
如果只有1个盘子,直接将A柱子上的盘子从A移到C
否则,先将A柱子上的n-1个盘子借助C移到B
直接将A柱子上的盘子从A移到C
最后将B柱子上的n-1个盘子借助A移到C
C实现
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<stdlib.h> 5 6 int hanoi(int n) 7 { 8 if (n == 1) 9 { 10 return 1; 11 } 12 else 13 { 14 return 2 * hanoi(n - 1) + 1; 15 } 16 } 17 18 //左边a->右边c,中间参数b是辅助盘 19 void hanoi1(int n, char a, char b, char c) 20 { 21 if (n == 1) 22 { 23 printf("%c->%c ", a, c); 24 } 25 else 26 { 27 hanoi1(n - 1, a, c, b);//中间参数c辅助 28 printf("%c->%c ", a, c); 29 hanoi1(n - 1, b, a, c);//中间参数a辅助 30 } 31 } 32 33 void main() 34 { 35 int n; 36 37 scanf("%d", &n);//代表汉诺塔有几个盘子 38 39 printf("移动%d次 ", hanoi(n)); 40 41 hanoi1(n, 'a', 'b', 'c'); 42 43 system("pause"); 44 }
C++实现
1 #include <iostream> 2 3 void hanoi(int n, char a, char b, char c)//参数说明,把左边a放到右边c,中间b不处理 4 { 5 static int count = 0; 6 count++; 7 std::cout << "第" << count << "次:"; 8 9 if (n < 1) 10 { 11 return; 12 } 13 else 14 { 15 hanoi(n - 1, a, c, b); 16 std::cout << a << "->" << c << std::endl; 17 hanoi(n - 1, b, a, c); 18 } 19 } 20 21 void main() 22 { 23 int n; 24 std::cin >> n; 25 26 hanoi(n, 'A', 'B', 'C'); 27 28 system("pause"); 29 }
12 计算1+(1*2)+(1*2*3)+...+(1*2*3*...*n)
需要用到双层递归,分别是阶乘和阶乘的相加
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<stdlib.h> 5 6 int fun(int num)//实现阶乘 1*2*3*...*n 7 { 8 if (num == 1) 9 { 10 return 1; 11 } 12 else 13 { 14 return num*fun(num - 1); 15 } 16 } 17 18 //双层递归 19 20 int add(int n)//实现相加 21 { 22 if (n == 1) 23 { 24 return 1; 25 } 26 else 27 { 28 return add(n - 1) + fun(n); 29 } 30 } 31 32 void main() 33 { 34 printf("%d ", add(1)); 35 36 printf("%d ", add(2)); 37 38 printf("%d ", add(3)); 39 40 system("pause"); 41 }
13 编写计算m的n次方的递归函数。
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include <stdio.h> 4 #include <stdlib.h> 5 6 int getm_n(int m, int n) 7 { 8 if (m == 0)//0的n次方是0 9 { 10 return 0; 11 } 12 else if (n == 0)//非0的0次方是1 13 { 14 return 1; 15 } 16 else 17 { 18 return getm_n(m, n - 1)*m; 19 } 20 } 21 22 void main() 23 { 24 int m = 2; 25 int n = 10; 26 27 printf("%d ", getm_n(m, n)); 28 29 system("pause"); 30 }
14 编一个程序,读入具有5个元素的整型数组,然后调用一个函数,递归计算这些元素的积。
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include <stdio.h> 4 #include <stdlib.h> 5 6 #define N 5 7 8 int cheng(int *arr, int n) 9 { 10 if (n == 0) 11 { 12 return arr[0]; 13 } 14 else 15 { 16 return cheng(arr, n - 1)*arr[n]; 17 } 18 } 19 20 void main() 21 { 22 int arr[N] = { 1,2,3,4,5 }; 23 int i; 24 25 for (i = 0; i < N; i++) 26 { 27 printf("%5d", arr[i]); 28 } 29 30 printf(" %d ", cheng(arr, N - 1));//最后的下标是N-1 31 32 system("pause"); 33 }
15 编一个程序,读入具有5个元素的实型数组,然后调用一个函数,递归地找出其中的最大元素,并指出它位置。
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include <stdio.h> 4 #include <stdlib.h> 5 6 int search_max(double *arr, int num)//递归查找数组最大值的下标,第1个参数是数组,第2个参数是数组元素个数 7 { 8 if (num == 1)//如果数组只有一个元素,最大值的下标就是0 9 { 10 return 0; 11 } 12 else 13 { 14 if (arr[num - 1] > arr[search_max(arr, num - 1)])//如果后面的元素比前面的元素大,返回后面元素的下标 15 { 16 return num - 1; 17 } 18 else 19 { 20 return search_max(arr, num - 1); 21 } 22 } 23 } 24 25 void main() 26 { 27 double arr[5] = { 1,2,3,4,5 }; 28 int num = search_max(arr, 5);//递归查找数组最大值的下标,第1个参数是数组,第2个参数是数组元素个数 29 30 printf("最大元素位置是%d,最大元素是%lf ", num, arr[num]); 31 32 system("pause"); 33 }
16 不使用+-*/,计算两个整数之和
1 #include <iostream> 2 3 //将来从事手机端、嵌入式开发,位操作 4 class jia 5 { 6 private: 7 int x; 8 int y; 9 public: 10 jia(int a, int b) :x(a), y(b)//构造函数 11 { 12 13 } 14 int jiafa()//返回相加的结果 15 { 16 return x + y; 17 } 18 int getx()//返回x的值 19 { 20 return x; 21 } 22 int gety()//返回y的值 23 { 24 return y; 25 } 26 int newjiafa(int a, int b)//递归 27 { 28 if (a == 0) 29 { 30 return b; 31 } 32 else if (b == 0) 33 { 34 return a;//让相与&慢慢趋势为0 35 } 36 else 37 { 38 int res = a^b;//异或,先求结果 39 int wei = (a&b) << 1;//进位,左移,乘以2 40 std::cout << "res=" << res << " wei=" << wei << std::endl;//打印中间值 41 return newjiafa(res, wei); 42 } 43 } 44 }; 45 46 void main() 47 { 48 jia jia1(10, 9);//创建对象 49 50 std::cout << jia1.newjiafa(jia1.getx(), jia1.gety()) << std::endl;//打印结果 51 52 system("pause"); 53 }
17 模拟计算器,输入字符串,计算结果
1 #include <iostream> 2 3 const int MAX = 1024; 4 5 void qukongge(char *str);//去除字符串的空格 6 double getnum(char *str, int & index);//分离数字,把字符串转换为数字 7 double fenxi(char *str); 8 double term(char *str, int & index); 9 char *extract(char *str, int &index); 10 11 void main() 12 { 13 char str[MAX] = { 0 }; 14 int i(0); 15 std::cout << "请输入表达式" << std::endl; 16 std::cin.getline(str, MAX); 17 18 qukongge(str);//去除字符串的空格 19 20 //std::cout << str << std::endl; 21 22 //std::cout << getnum(str, i) << std::endl; 23 24 std::cout << fenxi(str) << std::endl; 25 26 } 27 28 void qukongge(char *str)//去除字符串的空格 29 { 30 int i(0); 31 int j(0); 32 33 while ((*(str + i) = *(str + j++)) != '