设为首页
|
收藏本站
|
繁体中文
|
手机版
整站搜索
资讯
技巧
源码
行业
设备(待改)
资源
信息库(待改)
产品
作品(待改)
活动
培训(视频)
平台(待改)
二级(待改)
互动(作废)
交易
Access培训
-
Access开发平台
-
Access行业开发
首页
资讯
技巧
源码
行业
资源
活动
关于
技巧
ACCESS数据库
启动/设置/选项/背景
修复/压缩
安全/加密/解密
快捷键
版本升级/其它等
数据表
命名方式/设计规范
表设计
查询
Sql语言基础
选择查询
更新查询
删除查询
追加查询
生成表查询
交叉表查询
SQL特定查询
查询参数
查询综合应用
界面/窗体/控件
标签
文本框
命令按钮
组合框/列表框
选项组/复选框/选项按钮
选项卡
子窗体
窗体本身/综合应用
其它
报表打印
报表设计
高级报表
模块/函数/VBA/API/系统
VBA基础
内置函数
调试/跟踪/Debug
模块/类模块
API/COM/系统相关
字符数字日期
网络通信游戏
加密解密安全
文件处理
经典算法
宏/菜单/工具栏/功能区
宏/脚本
菜单/工具栏
功能区/Ribbon
图表/图形/图像/多媒体
图表
图形/图像
音频
视频/动画
DAO/链接表/ADO/ADP
DAO/链接表/ODBC
ADO/RDO
ADP
ActiveX/第三方控件/插件
Treeview树控件
ListView列表控件
Toolbar工具栏控件
微软其它控件
Dbi-Tech
CodeJock
Grid++Report
FastReport
ComponentOne
加载项/插件/Addin
OFFICE集成/导入导出/交互
Excel导入导出/交互
Word导入导出/交互
PPT交互
Outlook控制/邮件
Text文本文件/INI/CSV
PDF/SWF/XML格式
CAD格式
Sharepoint/其它Office
SqlServer/其它数据库
表
视图
存储过程/触发器
函数
用户/权限/安全
调试/维护
SqlServer其它/综合
发布/打包/文档/帮助
开发版/运行时
打包/发布/部署
开发文档/帮助制作
Access完整行业系统
采购管理系统
销售管理系统
仓库管理系统
人力资源管理HRM
CRM管理系统
MRP/ERP管理系统
BRP/流程优化
其它管理系统
心得/经验/绝招
其它/杂项
Excel技巧
Excel应用与操作
Excel开发编程
Word技巧
Word应用与操作
Word开发编程
Outlook技巧
Outlook应用与操作
Outlook开发编程
热门文章
Access平发平台自动升..
Access七种提高代码的..
用函数简化你的字符串连接语..
将Access数据库移植到..
程序设计中的感悟
一个简单的透视图实例
最新文章
Access数据库设计技巧..
Access数据库设计技巧..
Access数据库设计技巧..
Access数据库设计技巧..
Access数据库设计技巧..
使用Access和Exce..
联系方式
Access交流网(免费Access交流)
QQ:18449932
网 址:
www.access-cn.com
当前位置:
首页
>
技巧
>
心得/经验/绝招
心得/经验/绝招
递归算法
递归算法
程序调用自身的编程技巧称为递归( recursion)。
一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
注意:
(1) 递归就是在过程或函数里调用自身;
(2) 在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。
一个比较经典的描述是老和尚讲故事,他说从前有座山,山上有座庙,庙里有个老和尚在讲故事,他说从前有座山,山上有座庙,庙里有个老和尚在讲故事,他说从前有座山, ……。这样没完没了地反复讲故事,直到最后老和尚烦了停下来为止。
反复讲故事可以看成是反复调用自身,但如果不能停下来那就没有意义了,所以最终还要能停下来。递归的关键在于找出递归方程式和递归终止条件。即老和尚反复讲故事这样的递归方程式要有,最后老和尚烦了停下来这样的递归的终止条件也要有。
阶乘的算法可以定义成函数
当 n>0时,用 f(n-1)来定义 f(n),用 f(n-1-1)来定义 f(n-1)……,这是对递归形式的描述。
当 n=0时, f(n)=1,这是递归结束的条件。
例:用递归策略求N!的解。
N!=1*2*3*...*N
分析:
(1) 不运用递归的解法
(2) 运用递归策略
N!=1*2*3*...*N
=[1*2*3*...*(N-1)]*N
(N-1)!=1*2*3*...*(N-1)
设 f(N)=N!
那么 f(N-1)=(N-1)!
则 f(N)=f(N-1)*N
这就是递归式子,由于式子中有N-1,所以N>=1,递归出口的条件是N=1时。
函数模式:
function f(n:integer):longint;
var
...
begin
if 递归出口的时候 then
f:=1
else
f:=f(n-1)*n;
end;
递归算法一般用于解决三类问题:
⑴. 数据的定义形式是按递归定义的。
比如阶乘的定义。
例 1 又如裴波那契数列的定义: f(n)=f(n-1)+f(n-2); f(0)=1; f(1)=2
对应的递归程序为:
var n:integer;
function f(n:integer):longint;
begin
case n of
0:f:=1; { 递归结束条件 }
1:f:=2;
else
f:=f(n-1)+f(n-2) {递归调用}
end
end;
begin
readln(n);
writeln(f(n))
end.
这类递归问题往往又可转化成递推算法,递归边界作为递推的边界条件。
⑵. 问题解法按递归算法实现。例如回溯等。
⑶. 数据的结构形式是按递归定义的。如树的遍历 , 图的搜索等。
递归解决实际问题的例子很多,如经典的梵塔问题。
例 2 梵塔问题:有 n个半径各不相同的圆盘,按半径从大到小,自下而上依次套在 A柱上,另外还有 B、 C两根空柱。要求将 A柱上的 n个圆盘全部搬到 C柱上去,每次只能搬动一个盘子,且必须始终保持每根柱子上是小盘在上,大盘在下。
在移动盘子的过程当中发现要搬动 n个盘子,必须先将 n-1个盘子从 A柱搬到 B柱去,再将 A柱上的最后一个盘子搬到 C柱,最后从 B柱上将 n-1个盘子搬到 C柱去。搬动 n个盘子和搬动 n-1个盘子时的方法是一样的,当盘子搬到只剩一个时,递归结束。
程序如下:
var a,b,c,number:integer;
procedure move(n,a,b,c:integer);
begin
if n=1 then writeln(a,'->',c)
else
begin
move(n-1,a,c,b);
writeln(a,'->',c);
move(n-1,b,a,c)
end;
end;
begin
write('the number of dish:');
readln(number);
move(number,1,2,3);
readln
end.
自然数的拆分,数字的拆分等都可以用到递归算法。
例 3 要求找出具有下列性质的数的个数 (包含输入的自然数 n):
先输入一个自然数 n(n<=500),然后对此自然数按照如下方法进行处理 :
①. 不作任何处理 ;
②. 在它的左边加上一个自然数 ,但该自然数不能超过原数的一半 ;
③. 加上数后 ,继续按此规则进行处理 ,直到不能再加自然数为止 .
样例 : 输入 : 6
满足条件的数为 6
16
26
126
36
136
输出 : 6
这道题只需求出满足条件的数的个数,在 n值不大的情况下用递归求解比较方便,因为它本身题目的条件就是递归定义的。
递归的样例程序如下:
var n,i:integer;
s:real;
procedure qiu(x:integer);
var k:integer;
begin
if x<>0 then
begin
s:=s+1;
for k:=1 to x div 2 do qiu(k)
end
end;
begin
readln(n);
s:=0;
qiu(n);
writeln(s:2:0)
end.
递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。
发布人:Grant-Access中国
分享到:
点击次数:
更新时间:2006-11-06 21:55:27 【
打印此页
】 【
关闭
】
上一条:
用代码隐藏ACCESS窗口
下一条:
在Word中利用Access的数据
相关文章
•
Access数据库设计技巧-第五部分
•
Access数据库设计技巧-第四部分
•
Access数据库设计技巧-第二部分
•
Access数据库设计技巧-第一部分
•
Access数据库设计技巧-第三部分
•
使用Access和Excel之间的选择理由
•
access开发应用程序的过程汇总
•
ACCESS提示错误信息,自动崩溃,数据库损坏的问题与解决办法
热门文章
[2009-11-28]
如何禁止Access自动保存
[2005-04-27]
把ACCESS编译成可执行文件
[2005-08-16]
在宏条件中判断窗体尾记录
[2005-08-16]
VBA中初始化ADO连接的几种方法
[2006-10-23]
用于将数字换汉字大写数字的函数
[2004-02-01]
第一次使用ACCESS2003的ADP项目和SQL Server 2000 Desktop Engin
热门产品