递归是种思想,不是算法。

一个算法,你用递归去实现,它就是递归算法;你用循环去实现,它就是非递归算法。递归与循环一一对应,大多数编程语言都支持循环,但不一定支持递归。

一个大问题,分解成类似的小问题,递归只用一句话就能描述这些“重复工作”,代码那叫一个简单!想想这句话的威力都觉得很牛B!

递归算法简单而又经典的例子有:n!、Fibonacci、Hanoi、回溯、树遍历、图搜索。敲代码的时候,递归反映为func()里调用func(),当然传入的形参是不一样的,而且递归必须要有exit door(不然递归到哪天才是个头呀,一直往深了递归,stack非给溢出不可,通常100层以上的递归就会overflow了)。递归算法其实是低效的,每次递归到下一层,系统都要为这一层记录返回地址、局部变量开辟stack空间,返回上一层的时候系统还要花时间删掉这些东东,系统真累!

下面看一下Honoi示例:

#include <stdio.h>

void move(char x,char y)

{

printf("%c-->%c/n",x,y);

}

main()

{

int m;

scanf("%d",&m);

hanoi(m,'1','2','3');

}

void hanoi(int n,char one,char two,char three)

{

if(n==1)move(one,three);

else

{

hanoi(n-1,one,three,two);

move(one,three);

hanoi(n-1,two,one,three);

}

}

/*

n>=2时, 移动分三步:

step1: 把A上的n-1个圆盘移到B上;

Step2: 把A上的一个圆盘移到C上;

Step3: 把B上的n-1个圆盘移到C上;

*/

循环与递归是一对一的,下面给出最简单的示例:

int n=5;

int a[]={1,2,3,4,5};

int main()

{

int sum=0;

for(int i=0;i<n;i++)

sum+=a[i];

sum=sum2(n-1);

}

int sum2(int n)

{

if(n<0)

return 0;

else

return sum2(n-1)+a[n];

}

假如你把算法设计成了递归形式,再用stack去模拟消递归,效果不一定就好,你只是做了系统做的事情。所以,不要盲目相信非递归算法就比递归算法效率高,如果消递归技术不好,效率还不及原来的呢。

做些练习巩固一下吧,用递归的方法完成:

1. 求数组中的最大数

2. 求n个整数的积

3. 求n个整数的平均值

4. 求n个自然数的最大公约数与最小公倍数

5. 有一对雌雄兔,每两个月就繁殖雌雄各一对兔子.问n个月后共有多少对兔子?

6. 已知:数列1,1,2,4,7,13,24,44,...求数列的第 n项.

第6题解答:

#include <stdio.h>

int main()

{

int n;

int a[]={1,1,2};

scanf("%d",&n);

int tem=sum(n);

printf("%d/n",tem);

return 0;

}

int sum(int n)

{

if(n<3)

return a[n];

else

return sum(n-1)+sum(n-2)+sum(n-3);

}

Ø         递归生成所有全排列

实现1:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

bool used[100];
char a[100],n,c[100];

int main(){
    scanf("%d",&n);
    scanf("%s",c);
    f(0);
    system("Pause");
    return 0;
}

int f(int dep){
    if(dep>=n){
        for(int i = 0;i<n;i++)
            printf("%c ",a[i]);
        printf("/n");
    }
    else{
        for(int i = 0;i<n;i++)
            if(!used[i]){
                a[dep] = c[i];
                used[i] = true;
                f(dep+1);
                used[i] = false;
            }
    }
}

12345,12354,12435,12453,…,54321

实现2:

设一组数p = {r1, r2, r3, ... ,rn}, 全排列为perm(p),pn = p - {rn}。因此Perm(p) = r1Perm(p1), r2Perm(p2), r3Perm(p3), ... , rnPerm(pn)。

#include <stdio.h>

int n = 0;

void swap(int *a, int *b)

{

int m;

m = *a;

*a = *b;

*b = m;

}

int main()

{

int list[] = {1, 2, 3, 4, 5};

perm(list, 0, 4);

printf("total:%d/n", n);

return 0;

}

void perm(int list[], int k, int m)

{

int i;

if(k > m)

{

for(i = 0; i <= m; i++)

printf("%d ", list[i]);

printf("/n");

n++;

}

else

{

for(i = k; i <= m; i++)

{

swap(&list[k], &list[i]);

perm(list, k + 1, m);

swap(&list[k], &list[i]);

}

}

}

并不是严格字典序的哦,例如12345,12354,12435,12453,“12543,12534”…

递归 递归 递归 —深入浅出相关推荐

  1. java 建树源码_Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】...

    import java.util.ArrayDeque; import java.util.Queue; import java.util.Stack; //二叉树的建树,前中后 递归非递归遍历 层序 ...

  2. 快排递归非递归python_Python递归神经网络终极指南

    快排递归非递归python Recurrent neural networks are deep learning models that are typically used to solve ti ...

  3. 二十一、二分查找算法(递归非递归)

    一.二分查找思路分析 1.首先确定该数组中间的下标 ,即mid=(left+high)/2; 2.然后让需要查找的value值与array[mid]值进行比较 2.1)findVal > arr ...

  4. 【C 语言】字符串模型 ( 字符串翻转模型 | 借助 递归函数操作 逆序打印字符串 | 递归要素 | 递归停止条件 | 递归操作 )

    文章目录 一.借助 递归函数操作 逆序打印字符串 二.完整代码示例 一.借助 递归函数操作 逆序打印字符串 递归需要掌握下面 222 个点 : 参数入栈模型 : 第 111 次 , "sdh ...

  5. c语言折半查找递归程序,C语言数据结构中二分查找递归非递归实现并分析

    C语言数据结构中二分查找递归非递归实现并分析 前言: 二分查找在有序数列的查找过程中算法复杂度低,并且效率很高.因此较为受我们追捧.其实二分查找算法,是一个很经典的算法.但是呢,又容易写错.因为总是考 ...

  6. 看动画学算法之:递归和递归树

    文章目录 简介 递归树和阶乘 斐波那契数列 GCD最大公约数 N中选K 0-1背包问题 硬币找零问题 数组的最长递增子序列 旅行商问题 简介 在之前我们介绍的很多数据结构和算法都用到了递归,递归非常容 ...

  7. [转载] Python 递归 深入理解递归 Python递归剖析,绝对让你看懂!

    参考链接: Python | print()中的结束参数 目录 递归剖析 递归的两个过程 return 返回值 详解 递归思路二分法和递归尾递归递归练习题 递归剖析 递归真的很重要,之前学的时候,学的 ...

  8. 递归 尾递归_递归,递归,递归

    递归 尾递归 by Michael Olorunnisola 通过Michael Olorunnisola 递归,递归,递归 (Recursion, Recursion, Recursion) Bef ...

  9. 折半查找(非递归与递归实现)

    折半查找非递归与递归实现: #include<stdio.h> int linner(int a[],int n,int value); int halfSearch(int a[],in ...

  10. python中递归函数的基例_详谈Python基础之内置函数和递归 Python递归和循环的区别...

    Python 递归函数基例 2. 关于递归函数基例的说明,以下选项中错误的是 A 递归函数的基例决定所谓基例就是不需要递归就能求解的,一般来说是问题的最小规模下的解. 例如:斐波那契数列递归,f(n) ...

最新文章

  1. 从零开始学python数据分析-【01】从零开始学Python—数据分析与挖掘概述
  2. 【嵌入式开发】ARM 代码搬移 ( ARM 启动流程 | 代码搬移 起点 终点 | 链接地址 | 汇编代码 )
  3. 3DSlicer33:Adding MRML
  4. android 判断网络是否可用
  5. Hadoop使用MultipleOutputs输出多文件或者指定命名
  6. js、react对象名和对象属性赋值
  7. http请求中乱码------编码的转换
  8. preg_match 参数获取两个_摄像相机标定到底是啥?标定完成得到的参数有什么用?...
  9. Multisim14仿真使用汇总
  10. 对996的一些看法与个人价值实现
  11. python登录系统三次锁定_Python基础篇-账号登录错误三次锁定
  12. ONF定义的SDN架构
  13. VB.net写的音乐播放器,带百度翻译歌词
  14. iOS 普陀大学堂APP隐私政策
  15. 曾国藩:一勤天下无难事(五勤)
  16. yocto的bitbake过程记录
  17. JavaOOP(面向对象)学习体会
  18. 深度学习入门 ---稀疏自编码器
  19. MTK 智能手机平台原生应用介绍
  20. 华为区块链项目总监: 华为区块链率先于溯源场景落地

热门文章

  1. 鹤岗市全国计算机等级考试,2020年3月黑龙江省鹤岗市计算机等级考试考务通知...
  2. 数字孪生系统有哪些意义?
  3. 浅谈nodejs与php设计构思层面上的差异
  4. python图灵_python图灵机器人
  5. 学习Cortex-M:三种关中断方式
  6. hadoop订单项目实战
  7. B - 东东学打牌(Week9.2作业)
  8. Java + lua = 王炸!!
  9. 2021长安二中高考成绩查询,2020年陕西高考成绩已公布,速看
  10. SAP ABAP MD61 / MD62 / MD63 BAPI 函数组 3027