郝斌老师数据结构10(递归)

    技术2022-07-13  90

     专题:递归

    【这对你的编码能力是个质的飞跃,如果你想成为一个很厉害的程序员,数据结构是必须要掌握的,因为计算机专业的本科生也达不到这水平!计算机特别适合用递归的思想来解决问题,但是我们人类用递归的思想来考虑问题就会感到十分困扰,这也是很多学过递归的人一直都搞不明白的地方!那是不是递归可以随便写,当然不是,有些同学一用递归程序就死翘翘了。递归的思想是软件思想的基本思想之一,在树和图论上面,几乎全是用递归来实现的,最简单,像求阶乘这种没有明确执行次数的问题,都是用递归来解决】

     

    定义:

             一个函数自己直接或者间接调用自己(一个函数调用另外一个函数和他调用自己是一模一样的,都是三步,只不过在人看来有点诡异)

    递归满足的三个条件:

           1.递归必须有一个明确的终止条件

           2.该函数的处理规模必须递减

           3.这个转化必须是可解的

    循环和递归:

            理论上循环能够解决的,肯定可以转化为递归,但这个转化是一个复杂的数学过程,递归能解决的不一定能转化为循环,初学者只要把经典的递归算法看懂就型,至于有没有能力运用看个人。

            递归: 易于理解   速度慢   存储空间大

            循环: 不易于理解    速度快   存储空间小  (这地方不太理解,明明是递归不好理解,循环好理解吧 ?_?)

    递归的应用:

           树和森林就是以递归的方式定义的

           树和图很多算法是以递归实现的

           很多数学公式的就是以递归的方式定义的,斐波那契数列。。。

     

    //递归解 前n自然数之和 long sum(int n) { if (1 == n) return 1; else return sum(n - 1) + n; } //递归 阶乘 long factorial(int n) { if (1 == n) return 1; else return factorial(n - 1) * n; } //递归 斐波那契数列 long fab(int n) { /*if (n < 3) return 1; int f1 = 1; int f2 = 1; int f3 = 0; int i; for (i = 3; i <= n; i++) { f3 = f1 + f2; f1 = f2; f2 = f3; } return f3;*/ if (1 == n || 2 == n) return 1; else return fab(n - 1) + fab(n - 2); } //递归 正整数倒序输出 void reverse(int n) { if (n < 10) printf("%d\n", n); else { printf("%d", n % 10); reverse(n / 10); } } //递归 字符串全排列输出 int k = 0; void swap(char* s, int m, int n) { char t = s[m]; s[m] = s[n]; s[n] = t; } void sort(char* s, char* c)//函数至少要两个参数,一个用来记录字符串头指针,还有一个记录当前处理的子串的头指针 { if (*(c + 1) == '\0') { printf("%d:", ++k);//把拢共排列的次数打出来,n! printf("%s\n", s); //要打印的是字符串s } else { int i; for (i = 0; *(c+i) != '\0'; i++) { //交换的目的是把每一个字符做一次头,此处传入的必须是c,即现在要全排的字符串头 swap(c, 0, i); //第一个参数必须是s,记录整体字符串,第二个必须是当前字符串c除去头部之后的子串,即c+1 sort(s, c + 1); //再交换回来,是防止错乱,恢复原状之后,再次进行下一轮 swap(c, 0, i); } } }

     

     

    Processed: 0.013, SQL: 10