递归
来源:互联网 发布:淘宝 500手机 编辑:程序博客网 时间:2024/06/05 09:59
【递归的定义】
①某一个概念是递归的:一个概念自己给自己定义
②某一个函数是递归的:一个函数直接或者间接地调用自己
【递归的意义】
将一个不能或不容易直接求解的“大问题”转化为若干个“小问题”来求解,再将这些“小问题”进一步转化成更小的“小问题”来求解,直至“小问题”可以直接求解。
【递归求解的条件】
①原问题可以通过一个转化过程,改变成为一个新问题,而新问题的求解法与原问题的求解法相同,只是所处理的对象有所不同,这些对象呈现出有规律的递增或递减;
②通过转化使问题的求解得以简化;
③有一个终止转化过程的条件。
例题:
计算:1+2+3+...+100
解答:令S(n)=1+2+3+…+n,
则S(n)= n+S(n-1) (n>1,S(1)=1)
分析:求S(100),可转化为100+S(99),而求S(99)又可转化为99+S(98),如此下去,所处理的对象n分别是100,99,98...,呈现出有规律的递减,而S(1)=1就是 一个终止转化过程的条件。
补充:
递归出口:终止转化过程的条件S(1)=1
递归过程:S(n)= n+S(n-1)
注意:转化过程不是随意的,要保证“大问题”与“小问题”的解法相同
【递归模型】
f(s0)= c0
f(sn)= g(f(sn-1),cn)
注:s0和c0为常数,cn是一个可直接求解的问题,g是一个非递归函数
【递归和迭代】
例题:将十进制数n转化为二进制数。
代码:
#include<stdio.h>void Dec2Bin1(int n)//递归函数{if(n>1)Dec2Bin1(n/2);//递归过程printf("%d",n%2);//递归出口}void Dec2Bin2(int n)//迭代函数{int stack[32],top=-1;//定义一个简易顺序栈if(n==0){printf("0");}else if(n>0){do{stack[++top]=n%2;//n%2入栈n=n/2;//n被2整除}while(n!=0);}while(top>=0){printf("%d",stack[top--]);//输出栈中元素}}int main(){int n;printf("请输入需要转换成二进制的十进制数:");scanf("%d",&n);printf("递归法求解%d的二进制得:",n);Dec2Bin1(n);printf("\n");printf("迭代法求解%d的二进制得:",n);Dec2Bin2(n);printf("\n");return 0;}【递归问题的分类】
①可直接求值,不需要回溯;
②不能直接求值,需要回溯。
分析:这两种递归问题均可转换成迭代求解,前者仅需引入几个变量来保存中间结果(直接转换法),后者需要借助栈来保存中间结果(间接转换法)。
【递归评价】
递归可以解决许多复杂问题;
用递归编程可极大地减少程序代码;
递归函数在执行过程中,需创建递归函数工作栈,从而占用大量内存,当递归调用次数非常大时,有可能耗尽系统的内存资源,使递归调用过程无法返回结果;
递归的执行效率较差。
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- R3修改线程上下文EIP实现的无模块注入
- Java中的Copy-On-Write容器
- 连接器的作用
- StringBuilder在后面加入内容用append,在前面呢?用insert(0,"xxxx")
- IEEE 802.1Q 第八章2/3/4节 笔记
- 递归
- 内核工具 – Sparse 简介
- iOS开发之NSString和UTF-8间的转换
- MYSQL 数据库导入导出命令
- openwrt+Linkit7688:LinkIt™ Smart 7688入门指南
- 过滤器、监听器、拦截器的区别
- 线程同步工具之CountDownLatch
- Servlet 生命周期、工作原理
- View的颜色(转载)-3