递归 递归 递归 —深入浅出
递归是种思想,不是算法。
一个算法,你用递归去实现,它就是递归算法;你用循环去实现,它就是非递归算法。递归与循环一一对应,大多数编程语言都支持循环,但不一定支持递归。
一个大问题,分解成类似的小问题,递归只用一句话就能描述这些“重复工作”,代码那叫一个简单!想想这句话的威力都觉得很牛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> bool used[100]; int main(){ |
int f(int dep){ |
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”…
递归 递归 递归 —深入浅出相关推荐
- java 建树源码_Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】...
import java.util.ArrayDeque; import java.util.Queue; import java.util.Stack; //二叉树的建树,前中后 递归非递归遍历 层序 ...
- 快排递归非递归python_Python递归神经网络终极指南
快排递归非递归python Recurrent neural networks are deep learning models that are typically used to solve ti ...
- 二十一、二分查找算法(递归非递归)
一.二分查找思路分析 1.首先确定该数组中间的下标 ,即mid=(left+high)/2; 2.然后让需要查找的value值与array[mid]值进行比较 2.1)findVal > arr ...
- 【C 语言】字符串模型 ( 字符串翻转模型 | 借助 递归函数操作 逆序打印字符串 | 递归要素 | 递归停止条件 | 递归操作 )
文章目录 一.借助 递归函数操作 逆序打印字符串 二.完整代码示例 一.借助 递归函数操作 逆序打印字符串 递归需要掌握下面 222 个点 : 参数入栈模型 : 第 111 次 , "sdh ...
- c语言折半查找递归程序,C语言数据结构中二分查找递归非递归实现并分析
C语言数据结构中二分查找递归非递归实现并分析 前言: 二分查找在有序数列的查找过程中算法复杂度低,并且效率很高.因此较为受我们追捧.其实二分查找算法,是一个很经典的算法.但是呢,又容易写错.因为总是考 ...
- 看动画学算法之:递归和递归树
文章目录 简介 递归树和阶乘 斐波那契数列 GCD最大公约数 N中选K 0-1背包问题 硬币找零问题 数组的最长递增子序列 旅行商问题 简介 在之前我们介绍的很多数据结构和算法都用到了递归,递归非常容 ...
- [转载] Python 递归 深入理解递归 Python递归剖析,绝对让你看懂!
参考链接: Python | print()中的结束参数 目录 递归剖析 递归的两个过程 return 返回值 详解 递归思路二分法和递归尾递归递归练习题 递归剖析 递归真的很重要,之前学的时候,学的 ...
- 递归 尾递归_递归,递归,递归
递归 尾递归 by Michael Olorunnisola 通过Michael Olorunnisola 递归,递归,递归 (Recursion, Recursion, Recursion) Bef ...
- 折半查找(非递归与递归实现)
折半查找非递归与递归实现: #include<stdio.h> int linner(int a[],int n,int value); int halfSearch(int a[],in ...
- python中递归函数的基例_详谈Python基础之内置函数和递归 Python递归和循环的区别...
Python 递归函数基例 2. 关于递归函数基例的说明,以下选项中错误的是 A 递归函数的基例决定所谓基例就是不需要递归就能求解的,一般来说是问题的最小规模下的解. 例如:斐波那契数列递归,f(n) ...
最新文章
- 从零开始学python数据分析-【01】从零开始学Python—数据分析与挖掘概述
- 【嵌入式开发】ARM 代码搬移 ( ARM 启动流程 | 代码搬移 起点 终点 | 链接地址 | 汇编代码 )
- 3DSlicer33:Adding MRML
- android 判断网络是否可用
- Hadoop使用MultipleOutputs输出多文件或者指定命名
- js、react对象名和对象属性赋值
- http请求中乱码------编码的转换
- preg_match 参数获取两个_摄像相机标定到底是啥?标定完成得到的参数有什么用?...
- Multisim14仿真使用汇总
- 对996的一些看法与个人价值实现
- python登录系统三次锁定_Python基础篇-账号登录错误三次锁定
- ONF定义的SDN架构
- VB.net写的音乐播放器,带百度翻译歌词
- iOS 普陀大学堂APP隐私政策
- 曾国藩:一勤天下无难事(五勤)
- yocto的bitbake过程记录
- JavaOOP(面向对象)学习体会
- 深度学习入门 ---稀疏自编码器
- MTK 智能手机平台原生应用介绍
- 华为区块链项目总监: 华为区块链率先于溯源场景落地
热门文章
- 鹤岗市全国计算机等级考试,2020年3月黑龙江省鹤岗市计算机等级考试考务通知...
- 数字孪生系统有哪些意义?
- 浅谈nodejs与php设计构思层面上的差异
- python图灵_python图灵机器人
- 学习Cortex-M:三种关中断方式
- hadoop订单项目实战
- B - 东东学打牌(Week9.2作业)
- Java + lua = 王炸!!
- 2021长安二中高考成绩查询,2020年陕西高考成绩已公布,速看
- SAP ABAP MD61 / MD62 / MD63 BAPI 函数组 3027