目录

  • 递归思路
  • T 1:求阶乘
  • T 2:求数组元素和
  • T 3:斐波那契数列
  • T 4:最大公约数
  • T 5:插入排序改递归
  • T 6:汉诺塔问题
  • T 7:二分查找的递归算法
  • T 8:小白上楼梯
  • T 9:求a的n次幂
  • 递归性能
  • 总结

递归思路

1、找重复:找出子问题

2、找变化:变化的量应该作为参数;

3、找边界:设计函数的出口;

T 1:求阶乘

输入n,使用递归的方法输出n!

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

T 2:求数组元素和

对arr的所有元素求和

int Rec(vector<int> arr,int begin)
{if (begin == arr.size() - 1)return arr[begin];return arr[begin] + Rec(arr,begin + 1);
}

T 3:斐波那契数列

f(0)=1

f(1)=1

f(2)=f(0)+f(1)=2

f(3)=f(1)+f(2)=3

f(n)=f(n-2)+f(n-1)

输入n,求f(n)

int Feb(int n)
{if(n==0 || n==1)return 1;return Feb(n-2)+Feb(n-1);
}

T 4:最大公约数

输入m,n,求它俩的最大公约数(m>n)

int Rec(int m,int n)
{if(n==0)return n;return Rec(n,m%n)
}

T 5:插入排序改递归

使用递归的方法对数组arr进行排序;

void insertSort(vector<int> &arr, int pos)//对arr[0]-arr[pos]进行排序
{if (pos == 0)return;insertSort(arr, pos - 1);//等pos前面的元素都排序完了,我再对pos元素进行排序;int p = pos;int val = arr[p];while (p > 0 && val < arr[p - 1])//只要比前面的元素小,就继续向前找位置{arr[p] = arr[p - 1];p--;}//此时arr[p]>arr[p-1],在此位置插入;arr[p] = val;
}

T 6:汉诺塔问题

A B C三处,将A处的n个盘子移动到C处,每次只能移动1个盘子,下盘子只能放在大盘子上面;


1、找重复:把n块盘子从A移动到C,那么我只需叫人通过中介C帮我把n-1个盘子移动到B处,然后我把第n个盘子移动到C处,再叫别人把B处的n-1个盘子通过中介A挪到C处;

2、找变化:移动过程中,初始地、中介、目的地以及目前移动的哪块盘子都不一样,这些都是变化量;

3、找边界:如果n==0时,不存在第0块盘子,所以此时什么都不用做,返回即可;

void Hanuo(int n, char begin, char help, char dest)
{if (n < 1)return;Hanuo(n - 1, begin, dest, help);cout << "move " << n << " from " << begin << " to " << dest << endl;Hanuo(n - 1, help, begin, dest);
}
int main()
{Hanuo(3, 'A', 'B', 'C');return 0;
}

T 7:二分查找的递归算法

对于有序数组arr,输入key,使用递归形式的二分查找方法查找key所对应的索引;

int BinarySearch(vector<int> arr, int left, int right, int key)
{if(left > right) //此时表示在数组arr中找不到该key值return -1;//二分查找int mid = left + (right - left) / 2;if (arr[mid] == key)return mid;else if (arr[mid] < key){return BinarySearch(arr, mid + 1, right, key);}else{return BinarySearch(arr, left, mid - 1, key);}
}

T 8:小白上楼梯

小白正在上楼梯,楼梯有n阶,小白一次可以上1阶、2阶或者3阶,实现一个方法,计算小白有多少种走完楼梯的方式;

int Dec(int n)
{//边界条件if(n==1)return 1;if(n==2)return 2;if(n==3)return 4;//递归return Dec(n-3)+Dec(n-2)+Dec(n-1);
}

T 9:求a的n次幂

设计一个高效的求a的n次幂的算法

24=2 * 2 * 2 * 2 =16;
22 * 22 =16;
如果指数是2的倍数,说明an可以直接用 an/2 * an/2 算出;
如果指数非2的倍数,则an可以直接用 an/2 * an/2 * a 算出(多乘一个a);
常规的递归求幂需要O(N)的时间复杂度,而这种方法只需O(log N);

int Dec(int a,int n)
{if(n==0)return 1;if(n%2==0) {int temp=Dec(a,n/2);return temp*temp;}else{int temp=Dec(a,n/2);return temp*temp*a;}
}

递归性能

递归的时间复杂度取决于子问题的分支数;

比如求阶乘的时间复杂度为O(n),而斐波那契时间复杂度大约为O(2n);

因为分支数越多意味着有更多的冗余运算,即多做了很多次重复的计算,这是就需要动态规划或者非递归的迭代形式来降低复杂度;

由于递归重复调用当前函数,函数主要使用栈空间,所以递归的空间复杂度也较高;

但递归有个最大的好处就是:容易理解;

总结

递归就是偷懒:

​ 我解决问题的一个部分,剩下的交给别人处理;或者理解为一个蛋糕,我只切一小块,剩下的怎么分交给别人完成;

Algorithm:递归思想及实例分析相关推荐

  1. C语言函数递归调用实验报告,C语言函数的递归和调用实例分析

    一.基本内容: C语言中的函数可以递归调用,即:可以直接(简单递归)或间接(间接递归)地自己调自己. 要点: 1.C语言函数可以递归调用. 2.可以通过直接或间接两种方式调用.目前只讨论直接递归调用. ...

  2. 【程序设计基础】第九、十、十一章 综合实例分析 递归

    实例分析: 闰年算法变化 1 resule:=0 2 if (y mod 400=0) or ((y mod 4=0) and (y mod 100<>0)) 3 then result: ...

  3. java 递归原理_Java中递归原理实例分析

    本文实例分析了Java中递归原理.分享给大家供大家参考.具体分析如下: 解释:程序调用自身的编程技巧叫做递归. 程序调用自身的编程技巧称为递归( recursion).递归做为一种算法在程序设计语言中 ...

  4. Javascript函数之深入浅出递归思想,附案例与代码!

    作者 | 浮世万千吾爱有三 责编 | Carol 来源 | CSDN 博客 递归函数的理解 1.生活中的递归 "递归"在生活中的一个典例就是"问路".如图小哥哥 ...

  5. OpenCASCADE 麻花钻头造型实例分析

    OpenCASCADE 麻花钻头造型实例分析 eryar@163.com Abstract. OpenCASCADE provides a simple twist drill bit modelin ...

  6. java中的递归算法_java递归算法实例分析

    递归算法设计的基本思想是: 对于一个复杂的问题,把原问题分解为若干个相对简单类同的子问题,继续下去直到子问题简单到能够直接求解,也就是说到了递推的出口,这样原问题就有递推得解. 在做递归算法的时候,一 ...

  7. 【PHP】php 递归、效率和分析

    递归的定义 递归(http:/en.wikipedia.org/wiki/Recursive)是一种函数调用自身(直接或间接)的一种机制,这种强大的思想可以把某些复杂的概念变得极为简单.在计算机科学之 ...

  8. linux程序卸载动态库,Intel平台下linux中ELF文件动态链接的加载、解析及实例分析(二): 函数解析与卸载...

    在 IBM Bluemix 云平台上开发并部署您的下一个应用. 相信读者已经看过了 Intel平台下Linux中ELF文件动态链接的加载.解析及实例分析(一): 加载的内容了,了解了ELF文件被加载的 ...

  9. 马歇尔·赫伯特:人工智能的前沿技术与实例分析

    来源:中国人工智能学会 2017年12月11日,国际知名机器人专家.美国卡耐基梅隆大学机器人研究所所长马歇尔·赫伯特(Martial Hebert)教授和首席科学家大卫·伯恩(David Bourne ...

最新文章

  1. Facebook AI新架构:全景FPN,同时完成图像实例与语义分割 | 极客头条
  2. 基于微软企业库的AOP组件(含源码)
  3. 链表问题(6)-----排序
  4. 类加载器-扩展加载器
  5. 怎么p出模糊的照片_36. 盲去卷积 - 更加实用的图像去模糊方法
  6. 卖萌屋原创专辑首发,算法镇魂三部曲!
  7. Mybatis 输出映射
  8. (27)呼吸灯verilog与VHDL编码(学无止境)
  9. mysql 数据库属性_mysql 查看数据库属性
  10. cesium 动态水面效果
  11. java+jquery实现长轮询案例_网页实时聊天之js和jQuery实现ajax长轮询
  12. tensorflow 的版本差异与变化
  13. [日推荐]『蓝轨迹外语自学中心』免费的全能外语自学工具
  14. 水下无线光通信关键技术与未来展望
  15. 大话IT第十期:由Windows 8引发的Wintel内讧
  16. 云计算OpenStack环境搭建
  17. python web py入门(1)-web.py简介和安装
  18. 日常面试刷题9-29
  19. SpringBoot项目去除druid监控的阿里广告
  20. 计算机如何连接wifi网络地址,电脑连接wifi无法获取ip地址怎么办

热门文章

  1. [Python]Matplotlib绘图基础
  2. jsp中 自定义 tag的几种方式
  3. svn的使用总结(待补充)
  4. 【转】Linux下软件安装的几种方式
  5. 设计类时需要注意的6个地方
  6. MapReduce 工作原理
  7. 【代码笔记】iOS-performSelectorOnMainThread
  8. .NET 工具生成引擎概述
  9. 最小生成树:Kruskal算法 和 Prim算法(第23章)
  10. git push 使用总结