• 经典算法_递归


    循环可以实现的,递归一定可以实现

    递归可以实现的,循环不一定可以实现。

    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++)) != '')
     34     {
     35         if (*(str + i) != ' ')//如果不是空格
     36         {
     37             i++;
     38         }
     39     }
     40 }
     41 
     42 double getnum(char *str, int & index)//分离数字,把字符串转换为数字
     43 {
     44     double value(0.0);
     45 
     46     if (*(str + index) == '(')
     47     {
     48         char *substr(nullptr);
     49         substr = extract(str, ++index);
     50 
     51         value = fenxi(substr);
     52         delete[]substr;
     53 
     54         return value;
     55     }
     56 
     57     if (!isdigit(*(str + index)))//如果不是数字
     58     {
     59         char error[30] = "get error";
     60         throw error;
     61     }
     62 
     63     while (isdigit(*(str + index)))
     64     {
     65         value = 10 * value + (*(str + index) - '0');
     66         index++;
     67     }
     68 
     69     if (*(str + index) != '.')//如果没有小数点
     70     {
     71 
     72     }
     73     else
     74     {
     75         double xiaoshu(1.0);
     76         while (isdigit(*(str + (++index))))
     77         {
     78             xiaoshu /= 10;
     79             value = value + (*(str + index) - '0')*xiaoshu;
     80         }
     81     }
     82     
     83     return value;
     84 }
     85 
     86 double fenxi(char *str)
     87 {
     88     double value(0.0);
     89     int index(0);
     90     value += term(str, index);//第一个数字
     91 
     92     for (;;)//后面的数字
     93     {
     94         switch (*(str + (index++)))
     95         {
     96         case '':
     97             return value;
     98         case '+':
     99             value += term(str, index);
    100             break;
    101         case '-':
    102             value -= term(str, index);
    103             break;
    104         default:
    105             break;
    106         }
    107     }
    108 }
    109 
    110 double term(char *str, int & index)
    111 {
    112     double value(0.0);
    113     value = getnum(str, index);//获取数据
    114     while (1)
    115     {
    116         if (*(str + index) == '*')//如果是*
    117         {
    118             value *= getnum(str, ++index);//先向后移动,跳过*,再调用函数
    119         }
    120         else if (*(str + index) == '/')//如果是/
    121         {
    122             value /= getnum(str, ++index);//先向后移动,跳过/,再调用函数
    123         }
    124         else
    125         {
    126             break;
    127         }
    128     }
    129     return value;
    130 }
    131 
    132 char *extract(char *str, int &index)
    133 {
    134     char *pstr(nullptr);
    135     int num(0);//记录有多少对()
    136     int bufindex(index);//记录下标,备份
    137     do
    138     {
    139         switch (*(str + index))
    140         {
    141         case ')':
    142             if (!num)
    143             {
    144                 ++index;
    145                 pstr = new char[index - bufindex];
    146                 if (!pstr)
    147                 {
    148                     throw "malloc fail";
    149                 }
    150                 strncpy_s(pstr, index - bufindex, str + bufindex, index - bufindex - 1);//拷贝字符串
    151                 return pstr;
    152             }
    153             else
    154             {
    155                 num--;
    156             }
    157             break;
    158         case '(':
    159             num++;
    160             break;
    161         }
    162     } while (*(str + index++) != '');
    163 
    164     throw "error fail";
    165 }
  • 相关阅读:
    JVM系列四:生产环境参数实例及分析【生产环境实例增加中】
    JVM系列三:JVM参数设置、分析
    JVM系列二:GC策略&内存申请、对象衰老
    JVM系列一:JVM内存组成及分配
    windows下揪出java程序占用cpu很高的线程 并找到问题代码 死循环线程代码
    微信小程序使用字体图标
    Jetson tx2 串口通信
    categorical[np.arange(n), y] = 1 IndexError: index 2 is out of bounds for axis 1 with size 2
    cannot import name '_imaging' 报错
    VS2015 opencv 无法打开文件“opencv_calib3d330d.lib”
  • 原文地址:https://www.cnblogs.com/denggelin/p/5487204.html
Copyright © 2020-2023  润新知