分享到:

化整为零,变繁为简

很高兴能和读者朋友们聊了这么多期的算法,到本期为止我们的算法演义栏目也要告一段落了。但朋友们研究学习算法不会就此结束,所以我想利用最后一期,结合我的一些实际经验来谈谈算法的学习。$$记得大一学C语言的时候,老师曾经布置过一道题,是要找出整数1到1000中的所有质数。为了解决这道题,我和我的一个好朋友在网吧里泡了近一个小时才勉强把题目给做完。在那次,笔者知道了使用子函数的好处。刚开始,出于对自己逻辑思维能力的自信,我们把所有的代码全部写在了main函数里。当调试软件的时候发现结果不对,但面对100多行包含着两个嵌套FOR循环和一堆条件判断语句的程序代码(现在看来是小儿科),我们真是有点束手无策。后来仔细地理了一遍解题思路,并把判断一个数是不是质数的程序部分提取出来作为一个单独的子函数,很快我们就找到了问题所在。在算法设计的思路里最基本的就是“化整为零,变繁为简”。像上面求质数的题目是比较简单的。如果遇到一些复杂的问题,我们首先要考...  (本文共2页) 阅读全文>>

权威出处: 电脑报2003/06/30
《中学数学教学》2001年01期
中学数学教学

两个递归函数的再研究

第 2 0届IMO试题 ,最初发表在《参考消息》1 978年 8月 1 9日第 4版上。当时由于印刷上的错误 ,曾经引起了数学教育界一场不小的风波。关键是 ,对于满足下列条件的函数 f、g∶N+ →N+ 1 f、g严格递增 ;2 f(N+ )∪g(N+ ) =N+ ;3 f(N+ )∩g(N+ ) = ;4 G(n) =f( f(n) ) +1。在初次发表时 ,将结论“求 f( 2 4 0 )”印成了“求f( 2w)” ,即把求函数值的问题 ,变成了求函数表达式的问题。而这两个问题的难易程度相差极大。因为这两个函数的表达式十分古怪 :f(n) =[nα], g(n) =[nβ],其中α =( 1 +5 ) /2 ,β=( 3+5 ) /2。时过境迁 ,近 2 0年来 ,他们已不被人们注意了。其实 ,这两个有深刻背景的函数 ,有一些有趣的性质 ,还是值得研究的。文献 [1 ]给出了函数 f(n)的递归表达式 :f(n +1...  (本文共1页) 阅读全文>>

《保山学院学报》2015年02期
保山学院学报

n-重递归函数的简化计算方法分析

引言n-重递归函数概念首先是由R.Peter提出并加以讨论的,R.Peter给出了n-重递归式。此后,Lachlan又把n-重递归式化归到更简单的形式[1]P281。n-重递归函数是对原始递归函数的扩充而引进的,而要想研究n-重递归函数,就得先从二重递归函数和三重递归函数上找到其自身内在的一些规律,这里体现的是数据结构中的一种“减治法(为求解一个规模为n的问题,先求解规模比原规模降低一个常数或降低将近一半的,与原问题类型相同的子问题,求出子问题的解后,再回头求解规模为n的原问题)”的思想。而对递归程序进行执行过程分析是了解其内部规律的一种较直接的方法,是对递归函数运行机制的清晰认识,分析和观察的主要内容包括:递归函数的调用过程;主要变量的取值变化[2]P83。1递归函数1.1什么是递归函数在C语言的函数中,有一类函数在执行的过程中,将直接或间接调用该函数本身,这类函数被称为递归函数[3]P80。递归算法的优点是:代码简洁且易编写...  (本文共5页) 阅读全文>>

《保山学院学报》2014年02期
保山学院学报

一种新的递归函数的递与归的分析方法

在C语言中允许函数的递归调用,即出现直接或间接的调用该函数本身[1]。更为切确地讲,就是当前正在执行着程序A,突然出现了一个调用其他程序的语句B,由于被调用程序B的执行级别高于A,因此就停止执行A,先去执行B,同时保存必要的信息,以便在程序B结束后继续执行A的过程。递归函数的主要优点就在于程序更易编写和理解,是循环程序设计的最佳表现。对于单重递归问题,例如求解n![2],递归函数的调用和分析推导很容易,但对于二重递归,问题的分析与推导较为复杂。在很多情况下,一般不愿意去设计和分析二重递归问题[3],[4]P1277-1291。如何简化二重递归问题的分析,实现快速准确的推导函数的递归结果?本文通过一个简单的例子来导出新的递归函数的递推与回归分析方法。1单重递归函数的递与归的分析方法1.1递归函数的递与归的分析方法单重递归函数的一般结构为:int f(){if(初始条件){return常数;}else f();return变量;}根...  (本文共6页) 阅读全文>>

《湖北广播电视大学学报》2012年09期
湖北广播电视大学学报

浅析递归函数在C++语言中的实现

1.引言如果定义一个概念或事物需要用到这个概念或事物本身,我们称它的定义是递归的(Recursive)。例如,下面这个故事:从前有座山,山上有座庙,庙里有个老和尚,正在给小和尚讲故事!故事是什么呢?“从前有座山,山上有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?‘从前有座山,山上有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?……’”当听到这个故事,一般人都会感觉到无聊之极。然而,数学上确实需要这种“无聊”呢,例如,有很多概念是用它自己来定义的,像n的阶乘是这样定义的:n的阶乘等于n乘以n-1的阶乘。如果这样就算定义完了,恐怕跟上面那个故事有异曲同工之妙了:n-1的阶乘是什么?是n-1乘以n-2的阶乘。那n-2的阶乘又是什么?这样下去,永无休止了。因此,需要定义一个最关键的基础条件:0的阶乘等于1。0!=1n!=n(n-1)!实质上,递归函数使用的是数学归纳法的理念,即初始条件和递推两者不可或缺。递归,...  (本文共2页) 阅读全文>>

《青岛大学学报(自然科学版)》1980年10期
青岛大学学报(自然科学版)

一类递归函数的转换

一类递归函数的转换高长铎(青岛大学计算中心,青岛266071)摘要本文证明了在FP系统内,对于含单位元的函数h,形为f=p→f。k;h。[f。i,j]、f=p→f。k;h。[i,f。j]和f=p→f。k;h。[f。i,f。j]的递归函数能转换为可展开的递归函数.关键词:函数程序设计;程序代数;递归函数;递归函数展开引言传统程序设计语言(如FORTRAN、PASCAL、C等)实际上是VonNeumann机的一种抽象,即用变量模拟计算机的存储单元,用控制语句模拟测试和跳转换令,用赋值语句模拟数据存取和算术运算.这些语言的最大缺陷是缺少有用的数学性质,存在不利于程序论证的因素(如破坏性赋值、函数的副作用等),并且程序的论证需要语言以外的知识[2](如最弱前谓词、循环不变式、良序集等).这些缺陷使得程序论证极为复杂,程序的正确性很难通过程序论证来保证,只好借助于程序测试.而程序测试只能证明错误的存在,不能证明错误的不存在,因此传统程序设...  (本文共5页) 阅读全文>>