递归的概念与模型设计
来源:互联网 发布:人工智能建模 编辑:程序博客网 时间:2024/06/08 08:45
在计算机编程的道路上,决心修行时,第一个想到的起点却是递归,也许这就是编程思想的一种默契。
递归是程序设计中一个强有力的工具,但是大多数人不会自然而然地想到递归。递归可以方便我们解决某些问题,我们需要考虑在哪些情况下使用递归。一个问题要采用递归递归方法来解决问题时,必须符合以下3个条件。
(1)解决问题时,可以把一个问题转化成为一个新的问题,而这个新的问题的解决方法仍与原问题的解法相同,只是处理的对象不同,这些处理的对象之间是有规律的递增或递减的;
(2)可以通过转化过程使问题得到简化;
(3)必定要有一个明确的结束递归的条件,否则递归将会无止境地进行下去,直到耗尽系统资源。也就是说必须要有某个终止递归的条件。
如阶乘问题,求n的阶乘(n!),可以转化为n(n-1)!;而要求n(n-1)!又可以转化为(n-1)((n-2)!;……;这里面都 有一个数乘以另一个数的阶乘问题,被处理的对象分别是n,n-1,……,是有规律的递减。但是我们不能让程序无止境地执行下去,必须给一个结束条件。该问题恰好有一个结束条件,即当n=0时,0!=1。
有两种情况常用到递归方法:
(1)定义是递归的。
(2)问题的解法是递归的。
阶乘函数的定义采用的就是递归方法。如
1 , n=0(递归终止条件)
n!={
n(n-1) , n>0(递归步骤)
算法:
public long fact(long n){
if(n==0) return 1;
else return n*fact(n-1);
}
递归模型反映一个递归问题的递归结构,例如:
(1)f(0)=1;
(2)f(n)=n*f(n-1) n>0;
公式(1)给出了递归的终止条件,公式(2)给出了f(n)的值与f(n-1)的值的关系,我们把(1)式称为递归出中,(2)式称为递归体。
一般地,一个递归模型是由递归出口和递归体两部分组成,前者确定递归到何时为止,后者确定递归的方式。
递归出中的一般格式为:f(s(0))=m(0);(这里s(0)和m(0)为常量)
递归体的一般格式为:f(s)=g(f(s(1)),f(s(2)),...,f(s(n)),c(1),c(2),...,c(m))(这里的s是一个递归的“大问题”,s(1),s(2),...,s(n)是递归的“小问题”,c(1),c(2),...,c(m)是若干个可以直接使用非递归方法就可以解决的问题)
- 递归的概念与模型设计
- 理解模型——用树的概念理解递归
- 递归函数的概念用法与实例
- 概念模型设计
- PowerDesigner设计概念模型
- SQLite的设计与概念
- SQLite的设计与概念
- SQLite的设计与概念
- IM 去中心化概念模型与架构设计
- IM 去中心化概念模型与架构设计
- 关于生产者与消费者模型的概念
- RPC 的概念模型与实现解析
- RPC 的概念模型与实现解析
- RPC 的概念模型与实现解析
- RPC 的概念模型与实现解析
- RPC 的概念模型与实现解析
- RPC 的概念模型与实现解析
- 用例模型与概念模型的区别和联系
- 大型网站典型故障案例分析
- 实验室开学会议总结
- Java学习之线程锁--单例模式--synchronized
- gitHub
- 解题报告 之 POJ2782 Bin Packing
- 递归的概念与模型设计
- Android从Camera中获取图片的两种方法
- Android的activity跳转动画实现
- 容易理解的博文---MVC
- Ios NSString 转 NSNumber
- SSM + Shiro 整合 (1)- 实现 Spring 的 HelloWorld
- *LeetCode-Binary Tree Preorder Traversal
- ubuntu重复登录界面问题
- 最简单的android NDK环境搭建