Office中国论坛/Access中国论坛
标题:
【新手进阶】之七:递归算法
[打印本页]
作者:
roych
时间:
2012-3-10 11:43
标题:
【新手进阶】之七:递归算法
在谈递归算法之前,不得不提的是斐波纳契(Fibonacci)数列。生于十二世纪的斐波纳契(Leonardo Fibonacci)曾提到这样一个问题:有一对兔子,如果每个月生一对小兔子,而刚生下来的兔子两个月后同样每个月生一对小兔子,那么,一对兔子一年内总共能生下几对兔子?
1……第一个月
1……第二个月
2……第三个月,产下第一只兔子(仔兔的第一个月)。
3……第四个月,产下第二只兔子(仔兔的第二个月)。
5……第五个月,产下第三只兔子,仔兔产下第一只兔子(仔兔的第三个月)。
……………………………………………………………………
于是得到这样一个数列:1,1,2,3,5,8,13,21……这在数学上解法很多,通项公式是:
an
=(1/√5)*{[(1+√5)/2]^n - [(1-√5)/2]^n},并由此引出了黄金比例等等。当我们把通项公式写成程序则得到以下函数:
Function GetF(N As Long)
GetF = (Sqr(5) / 5) * (((1 + Sqr(5)) / 2) ^ N - ((1 - Sqr(5)) / 2) ^ N)
End Function
复制代码
我们需要获取具体值(例如
a5
)时,就可以直接调用了:
Sub Test()
Debug.Print GetF(5)
End Sub
复制代码
显然,数学不太好的盆友们,一时间未必能推导出通项公式,可如果恰好需要去完成这项任务,该怎么办呢?我们只能使用反推法:
从数列中可以看得出来,后一项是前面两项之和。先得到最后一项,再得到倒数第二和倒数第三项,然后再继续往前推,直至得到第一项和第二项。于是整个结果就出来了。
这就是程序上最常用的递归思想。现在我们开始写函数:
Function Fibonacci(N As Long)
If N = 1 Or N = 2 Then Fibonacci = 1
If N >= 3 Then Fibonacci = Fibonacci(N - 1) + Fibonacci(N - 2)
End Function
复制代码
这显然比用通项公式解答起来简单多了。以N=4时为例,运行过程大体如下:
Fibonacci(4)→Fibonacci(3)+Fibonacci(2)→Fibonacci(2)+Fibonacci(1)+Fibonacci(2)→1+1+1=3
记得前些日子
ycxchen
提及,在Access中这些是如何应用的。其实这个算法在Access里也是可以用得上的,常见于树控件中。Kangking同志曾在《
程序界面兼工具栏、树、状态栏、页标签及进度条等控件的应用
》里就用过它来展开子节点,有兴趣的版友可以去看看。
这里给一个比较简单的作业,用递归思想写一个阶乘的函数。
【新手入门】之一:If分支语句
【新手入门】之二:分支语句总结
【新手入门】之三:循环语句For
【新手入门】之四:循环语句Do和死循环
【新手入门】之五:公共变量与传址过程、传值过程
【新手入门】之六:“悲欢离合总无情”——浅谈Split和Join
【新手入门】之七:嵌套与并列——再谈If流程问题
【新手入门】之八:“连就连”——浅谈“&”和“+”连接符的区别
【新手入门】之九:从百钱百鸡谈起——浅谈“规划求解”兼答lingjiang问
【新手入门】之十:书到用时方恨少——自定义菜单(Access 2003)的制作
【新手入门】之十一:浅谈ADO之序言
【新手入门】之十二:浅谈ADO之Connection
【新手入门】之十三:浅谈ADO之Conmmand(上)
【新手入门】之十四:浅谈ADO之Command(下)
【新手入门】之十五:浅谈ADO之Recordset(上)
【新手入门】之十六:浅谈ADO之Recordset(下)
【新手入门】之十七:浅谈列表框的使用
【新手入门】之十八:双击列表框修改数据
【新手入门】之十九:从“书与女友恕不外借”谈起——浅谈“Bookmark”的使用
【新手入门】之二十:“书与书签”——bookmark属性答疑
【新手入门】之二十一:记录集的“凌迟”——逐条导出记录集
【新手进阶】之一:基础算法(一)
【新手进阶】之二:基础算法(二)
【新手进阶】之三:基础算法(三)
【新手进阶】之四:基础算法(四)
【新手进阶】之五:排序搜索(一)
【新手进阶】之六:排序搜索(二)
【新手进阶】之七:递归算法
【新手进阶】之八:冒泡排序
【新手进阶】之九:浅谈不绑定数据源操作记录
【新手进阶】之十:工作日的计算
【新手进阶】之十一:“庖丁解牛”和“纪昌学射”——浅谈表格式文本数据的导入
【新手进阶】之十二:从四脚腾空的奔马谈起——原来界面可以这样设计
【新手进阶】之十三:Outlook风格导航界面
【新手进阶】之十四:仓库管理系统
作者:
ycxchen
时间:
2012-3-10 12:05
第一个学习!
作者:
阳春面
时间:
2012-3-10 12:10
学习
作者:
JosephTan
时间:
2012-3-10 13:34
有兴趣,看看。
作者:
xie62
时间:
2012-3-10 13:41
学习学习学习
作者:
风中漫步
时间:
2012-3-10 13:53
那个数列还真没听说过.挺复杂的.其实在生活中类递归的例子真有,如常说的:从前有座山,山上有做庙,庙里有个老和尚在给小和尚讲故事,讲的什么故事呢?从前有座山,山上有做庙,庙里有个老和尚在给小和尚讲故事,......
记得偶上小学时,班里有个同学特有才,那时偶根本不知道这叫有才.他写了篇作文,讲述的是他与父亲搬砖,"搬了一块又一块,搬了一块又一块,搬了一块又一块,.......",直到达到老师要求的字数后才停止了调用.当时这篇作文被老师当众批评了.我学编程后才知道那同学使用的是递归
作者:
fnsmydyang
时间:
2012-3-10 16:21
学习了,谢谢。
作者:
yanghua1900363
时间:
2012-3-10 16:41
学习!
作者:
风中漫步
时间:
2012-3-11 12:48
本帖最后由 风中漫步 于 2012-3-11 13:48 编辑
roych 为什么不是简单的循环语句呢?
递归的特点是自己调用自己.
斑竹讲到这我也就跟进了,这用循环也可解决的.可能我理解的会有偏差,还请斑竹批评指正了.
这个我对低归的理解,请大家批评:
Function by(zs As String) As Long
If Len(zs) > 100 Then Exit Function
Text1 = zs
zs = zs + "搬了一块又一块,"
Call by(zs)
End Function
作者:
imono
时间:
2012-3-11 20:25
厉害,旁征博引,说的很清楚,谢谢!
作者:
xuwenning
时间:
2012-3-12 08:48
学习学习
作者:
13601812106_01
时间:
2012-3-14 11:51
学习学习
作者:
efcndi
时间:
2012-3-14 13:24
学习学习
作者:
fnsmydyang
时间:
2012-3-14 14:51
学习学习...
作者:
吴木头
时间:
2012-3-14 16:24
看起来简单其实挺难的
作者:
zhylee
时间:
2012-3-15 13:00
作者:
aslxt
时间:
2012-3-18 22:20
本帖最后由 aslxt 于 2012-3-18 22:45 编辑
学习一下。
顺便问一下:用递归的方法如何知道自己被调用了多少次呢?
比方说:从我开始,我的领导是谁,然后领导的领导是谁,递归下去,都归胡总管辖。这个方法我知道用一个函数可以解决。但是从“我”到“胡总”,一共有多少层级可以管到我?这个问题如何解决?
作者:
roych
时间:
2012-3-19 11:42
aslxt 发表于 2012-3-18 22:20
学习一下。
顺便问一下:用递归的方法如何知道自己被调用了多少次呢?
比方说:从我开始,我的领导是谁, ...
递归算法并不知道自己被调用多少次,只知道根据参数由顶层递归到底层,然后再层层返回而得到结果。
因此,被调用次数是在递归算法中被作为参数来赋值的。以本文为例,你只有知道多少个月,才可能算得出兔子有多少只。
作者:
ruanjy
时间:
2012-3-21 09:22
[模块/函数
作者:
renyucai1963
时间:
2012-3-29 08:32
学习。
作者:
yori2007
时间:
2012-4-1 22:53
作者:
jinzhanxi
时间:
2012-7-30 09:10
谢谢分享
作者:
wang1950317
时间:
2013-2-1 13:17
好好学习!
作者:
wang1950317
时间:
2013-2-1 13:22
谢谢!学习!
作者:
smilingkiss
时间:
2013-2-1 22:10
learning
作者:
yanwei82123300
时间:
2013-2-2 10:45
谢谢分享
作者:
sukunli
时间:
2013-3-7 22:35
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
作者:
微微森林
时间:
2013-3-28 20:38
继续跟进
作者:
msyangyi
时间:
2014-5-26 13:26
学习,谢谢老师
作者:
zpy2
时间:
2014-6-23 06:49
赞!!!!!!
作者:
drizzt007
时间:
2014-9-2 16:32
学习~谢谢高手分享~~~~
作者:
sanjian
时间:
2014-11-12 12:38
还得多学啊
作者:
fffox
时间:
2015-1-7 19:13
学习递归
作者:
天涯沦落20131
时间:
2015-1-8 12:48
aaaaaaaaaaa
作者:
桑松木
时间:
2015-1-10 19:31
谢版主
作者:
friendship
时间:
2015-2-1 16:22
作者:
nihao2015
时间:
2015-2-2 10:51
111
作者:
tiantianiec
时间:
2015-2-2 16:40
aaaaaaaaaaa
作者:
xyangjie
时间:
2015-4-15 17:43
作者:
鄱湖人2012
时间:
2015-4-30 19:36
KANKAN
作者:
songgpljh
时间:
2015-10-10 16:02
学习一下
作者:
WFH6898
时间:
2015-11-11 18:10
一直搞不懂啊,多学习
作者:
cshiq
时间:
2016-1-17 05:45
递归算法
作者:
socar_bbman
时间:
2016-2-22 01:05
看看作业
作者:
chemi_lai
时间:
2016-3-30 22:18
数学不好,路过
作者:
qtx
时间:
2016-4-14 10:53
学习,这个不太懂
作者:
神经挺住
时间:
2016-4-15 13:51
学习
作者:
Superleistung
时间:
2016-4-21 08:11
谢谢分享~
作者:
pycqldt
时间:
2016-4-22 23:25
数学不好啊
作者:
ajch
时间:
2016-6-3 21:46
努力学习
作者:
山之冬
时间:
2016-7-1 12:24
学习
作者:
逍遥骑士wei
时间:
2016-7-26 17:14
666666666666666666
作者:
uncletse
时间:
2016-7-31 10:09
感謝分享,,辛苦了
作者:
李力军2
时间:
2016-8-3 18:34
学习
作者:
huangmin_best
时间:
2016-8-5 10:21
感觉好难得节奏,数学不好,好东西大家分享
作者:
wind7412
时间:
2016-9-7 10:40
学习一下
作者:
baiqiansheng
时间:
2016-10-25 14:40
支持!!!!!!!!!!!!
作者:
付谦
时间:
2016-10-26 12:37
学习提高
作者:
lms008008
时间:
2016-11-9 17:46
学习了,很不错
作者:
寒月TEA
时间:
2017-1-23 11:30
感谢分享
作者:
wenbin_zheng
时间:
2017-2-11 14:08
学习
作者:
anttsy
时间:
2017-2-22 13:29
111111111
作者:
72310
时间:
2017-2-27 16:48
新手回复
作者:
miaoiyangzhi
时间:
2017-3-21 11:30
66666学习
作者:
ej1213
时间:
2018-6-8 16:56
学习
作者:
hxx3970
时间:
2018-9-12 13:11
学习一下
作者:
XH8608208
时间:
2019-4-27 15:52
学习学习
作者:
heqing3000
时间:
2020-4-29 09:36
:):):):):):):):):)
作者:
cclxf
时间:
2021-8-10 09:32
学习学习!
欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/)
Powered by Discuz! X3.3