2019独角兽企业重金招聘Python工程师标准>>>

一、递归

      1.递归的定义

一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法叫做递归, 它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。

一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

使用递归要非常注意,否则会造成程序执行效率低。

      2.斐波那契数列

如果说兔子在出生两个月后,就有繁殖能力,一对兔子每个月能胜出一对小兔子来。假设所有兔子都不会死去,能够一直繁殖下去,那么一年以后可以繁殖多少对兔子呢?

      (1)斐波那契数列的迭代实现

我们可以用数学函数来定义:

代码实现:打印出前40位斐波那契数列数,使用迭代实现

#include <stdio.h>int main(){int iint a[40];a[0] = 0;a[1] = 1;printf("%d %d ", a[0], a[1]);for(i=2; i<40; i++){a[i] = a[i-1] + a[i-2];printf("%d ", a[i]);}return 0;
}

      (2)斐波那契数列的递归实现

int Fib(int i){if(i<2){return i == 0 ? 0 : 1;}return Fib(i-1) + Fib(i-2);
}

      (3)总结

  • 对比两种实现方式,迭代和递归的区别是:迭代使用的是循环结构,递归使用的是选择结构;
  • 使用递归能使程序的结构更清晰、更简洁、更容易让人理解,从而减少读懂代码的时间;
  • 但是大量的递归调用会创建函数的副本,会消耗大量的时间和内存,而迭代则不需要;
  • 递归函数分为调用和回退阶段,递归的回退顺序是它调用顺序的逆序。

再举个例子:计算n的阶乘n!

int factorial(int n){if(0 == n){return 1;}return n*factorial(n-1);
}

分析函数调用和回退顺序:当n=5时

      3.实例分析

题目:编写一个递归函数,实现输入的任意长度的字符串反向输出的功能,例如输入字符串LOVE,则输出字符串EVOL;

代码实现:输入结束条件为"#"

void print(){char a;scanf("%c",  &a);if(a != '#'){print();}if(a != '#'){printf("%c", a);}
}

二、分治思想

      1.分治思想简述

  • 当一个问题规模较大且不易求解的时候,就可以考虑将问题分成几个小的模块,再逐一解决;
  • 分治思想一般都会和递归一起使用,因为采用分治思想处理问题,其各个小模块通常具有与大问题相同的结构,这种特性也使递归技术有了用武之地。

2.折半查找算法的递归实现

折半查找法是一种常用的查找方法,该方法通过不断缩小一半查找的范围,直到达到目的,所以效率比较高。

      (1)迭代代码实现

#include <stdio.h>int bin_search( int str[], int n, int key )
{int low, high, mid;low = 0;high = n-1;while( low <= high ){mid = (low+high)/2;if( str[mid] == key ){return mid;                // 查找成功}if( str[mid] < key ){low = mid + 1;        // 在后半序列中查找}if( str[mid] > key ){high = mid - 1;        // 在前半序列中查找}}return -1;                                // 查找失败
}int main()
{int str[11] = {1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89};int n, addr;printf("请输入待查找的关键字: ");scanf("%d", &n);addr = bin_search(str, 11, n);if( -1 != addr ){printf("查找成功,可喜可贺,可口可乐! 关键字 %d 所在的位置是: %d\n", n, addr);}else{printf("查找失败!\n");}return 0;
}

      (2)递归实现

#include <stdio.h>int bin_search(int *str, int n, int key)
{int m, low = 0, high = n-1;int mid = (low+high)/2;if ( str [mid] == key)return mid;if ( str[low] >= str[high])return -1;if ( str[mid] < key ){ // 查找的key大于mid所在值low = mid + 1; // 将low移到原来mid的后一个位置m = bin_search(&str[low], high-low+1, key);}if ( str[mid] > key ){// 查找的key小于mid所在值high = mid - 1; // 将high移到原来mid的前一个位置m = bin_search(&str[low], high-low+1, key);}if ( -1 != m )m += low;return m;
}int main(void)
{int str[11] = {1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89};int m,addr;printf("请输入待查找的关键字: ");scanf("%d", &m);addr = bin_search(str, 11, m);if ( -1 != addr ){printf("查找成功,可喜可贺,可口可乐! 关键字 %d 所在的位置是: %d\n", m, addr);}else{printf("查找失败!\n");}return 0;
}

本文为原创文章,如果对你有一点点的帮助,别忘了点赞哦!比心!如需转载,请注明出处,谢谢!

转载于:https://my.oschina.net/aibinxiao/blog/1838412

数据结构与算法之递归和分治思想相关推荐

  1. 第2章 递归与分治思想

    第2章 递归与分治思想 文章目录 第2章 递归与分治思想 一.递归 1.1 例4 归并排序.快速排序 1.2 归并排序: 1.3 快速排序 1.4 小q的数列 1.5 树 二.分治 2.1 FBI树 ...

  2. 数据结构与算法之递归题目

    数据结构与算法之递归题目 目录 求n!的结果 汉若塔问题 打印字符串的全部子序列,包括空字符串 打印一个字符串的全部排序 1. 求n!的结果 public static long getFactori ...

  3. 递归和分治思想及其应用

    目录 递归和分治思想 一些实例 逆序输出字符串 查找数组元祖是否存在 汉诺塔问题 八皇后问题 更多: 递归和分治思想 如果可以使用迭代,尽量别使用递归.由编译原理可以知道,每次自调用的时候,计算机都需 ...

  4. 数据结构和算法(十)递归-迷宫游戏

    1. 数据结构和算法(十)递归-迷宫游戏 1.1 迷宫游戏   今天做一个简单的迷宫游戏,用二维数实现地图,让程序自动寻路的小游戏. 1.2 简单的迷宫 简单的迷宫 用二维数实现地图,找路策略:[右- ...

  5. 数据结构与算法_03_分而治之的分治算法

    数据结构与算法,系列文章传送地址,请点击本链接. 目录 一.如何理解分治算法 二.分治算法需要满足的条件 三.分治算法--代码模板 四.案例 五.分治思想在海量数据处理中的应用 一.如何理解分治算法 ...

  6. 006.递归和分治思想

    为什么80%的码农都做不了架构师?>>>    斐波那契数列的递归实现  迭代实现  递归   1.递归 定义 迭代使用的是循环结构. 递归使用的是选择结构. 优点 使用递归 ...

  7. 数据结构与算法之递归系列

    本文来自一个不甘平凡的码农 写在前边 几个月之前就想写这样一篇文章分享给大家,由于自己有心而力不足,没有把真正的学到的东西沉淀下来,所以一直在不断的在自学. 然后又用了一个星期的时间去整理.分类,才有 ...

  8. 常用算法总结(穷举法、贪心算法、递归与分治算法、回溯算法、数值概率算法)

    博主联系方式: QQ:1540984562 微信:wxid_nz49532kbh9u22 QQ交流群:892023501 目录 1.穷举法 2.贪心算法 3.递归与分治算法 4.回溯算法 5.数值概率 ...

  9. 数据结构与算法解析 -- “递归”篇

    2020-6-16 十步杀一人,千里不留行.事了拂衣去,深藏身与名. 李白 – <侠客行 > 一.概述 递归,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法.也就是说,递归算法 ...

  10. python数据结构与算法 20 递归和递归三定律

    递归 本章目标 理解很多复杂问题,如果不用递归就很难解决,用递归也许非常简单 学会怎样进行递归编程 理解并应用递归三定律 理解递归也是一种迭代 建立一个问题的递归方法 理解递归在计算机系统内是如何进行 ...

最新文章

  1. VScode配置CMAKE文件
  2. P2480 [SDOI2010]古代猪文
  3. linux识别fat16还是32,FAT16 、FAT32 、NTFS、LINUX区别.doc
  4. TCP/IP协议中的一些常用端口简单讲解
  5. 51Nod 1439 - 互质对(容斥+莫比乌斯函数)
  6. 天谕手游与奥特曼联手,玩家看到有多么激动?
  7. proxool java_Java应用中使用Proxool
  8. 下一个计划 : .NET/.NET Core应用性能管理
  9. Spring AOP 的切点切在Controller上没有起作用的问题。
  10. Angular4.x+Ionic3 踩坑之路之打包时出现JAVASCRIPT HEAP OUT OF MEMORY的几种解决办法
  11. 2018.12.17-dtoj-1170-最长公共子串
  12. Android 移动开发知识体系
  13. PS 2022,PR 2018,AE 2017【百度网盘链接,没套路】
  14. 30分钟一部动画短片!从MMD入门3D世界,边玩边学的3D教程!(一)“MMD快速入门教程CSDN”
  15. 第二章笔记:计数初步
  16. 微信公共号申请图文详解
  17. Ubuntu 如何安装 微信?实测
  18. 向量学习过程思想总结概括
  19. 重力感应贪吃蛇(C51 MPU6050 8*8LED点阵)
  20. altium designer 心得

热门文章

  1. Sublim text3汉化
  2. vSphere虚拟机磁盘热扩容
  3. Python星号表达式
  4. Hive实现oracle的Minus函数
  5. GridView 中如何给删除按钮添加提示
  6. 浅谈Web网站的架构演变过程
  7. mysql查询时去除重复数据以及 FOUND_ROWS 统计记录函数
  8. EmptyRecycle() 清空回收站
  9. 一个奇妙、离奇的算法题
  10. 深入理解函数中分配内存的问题