`

关于递归函数问题二文

 
阅读更多
http://www.dedecms.com/web-art/JSPjiaocheng/20060413/22733.html
递归函数之JAVA演绎
[浏览: <script language="javascript" src="http://www.dedecms.com/plus/count.php?aid=22733&amp;mid=0&amp;view=yes" type="text/javascript"></script> 45 评论(0条)] 来源:互连网 [2006-04-13]
1、递归函数的定义:

答:递归函数即自调用函数,在函数体内直接或间接的调用自己,即函数的嵌套是函数本身。

2、递归方式:递归调用有直接递归和间接递归两种方式。

A:直接递归:在函数中出现调用函数本身。

示例1:下面代码求斐波那契数列第n项,斐波那契数列第一和第二项是1,后面每一项是前两项之和,即1、1、2、3、5、8、13 ...。

程序代码:

public class Test {

public static void main(String args[]) {

int x1 = 1;

int sum = 0;

int n = 7;



for (int i = 1; i <= n; i++) {

x1 = func(i);

sum = sum + x1;

}

System.out.println("sum=" + sum);

}



public static int func(int x) {

if (x > 2)

return (func(x - 1) + func(x - 2));

else

return 1;

}

}



B:间接递归:指函数中调用了其他函数,而该其他函数有调用了本函数。

示例2:用间接递归来计算上述斐波那契数列。

程序代码:

public class Test {

public static void main(String args[]) {

int x1 = 1;

int sum = 0;

int n = 7;



for (int i = 1; i <= n; i++) {

x1 = func1(i);

sum = sum + x1;

}

System.out.println("sum=" + sum);

}

public static int func1(int a){

int b;

b=func2(a);

return b;

}



public static int func2(int b) {

if (b> 2)

return (func1(b - 1) + func1(b - 2));

else

return 1;

}

}

3、为什么要用递归函数?递归函数的缺点是什么?

答:递归的目的是简化程序设计,使程序易读。

示例3:下面不用递归函数继续来计算上述斐波那契数列。

程序代码:

public class Test {

public static void main(String args[]) {

int n=7;

int a=1, b=1, temp;

int sum=2;



for(int i=3; i<=n; i++){

temp=a+b; a=b; b=temp;

sum=sum+temp;

}

System.out.println("sum=" + sum);

}

}

从上面例子我们可以发现虽然非递归函数效率高,但较难编程,可读性较差。递归函数的缺点是增加了系统开销,也就是说,每递归一次,栈内存就多占用一截。



4、递归的条件:

答:需有完成任务的语句,需满足递归的要求(减小而不是发散)。

5、递归进阶:

示例4:

编程求解:若一头小母牛,从出生起第四个年头开始每年生一头母牛,按次规律,第n年时有多少头母牛?



程序代码:

public class Test3 {

public static void main(String args[]) {

int n=10; //要查看的年数

System.out.println("共有"+cattle(n)+"头小母牛!");

}

public static int cattle(int n){

if(n<=0)

return 0;

if(n<=3)

return 1;

return cattle(n-1)+ cattle(n-3);//此处是递归要好好理解。

}

}



规律:此类问题的递归函数为:

如果要求的是从出生起第四个年头,则递归函数为cattle(n-1)+ cattle(n-3),

如果要求的是从出生起第五个年头,则递归函数为cattle(n-1)+ cattle(n-4),

。。。。

依次类推。

(原代码全部在JBuilderX下调试通过)


http://www.goc.ac.cn/liuag/html/relationOfRecursion_progamming.html

递归函数论与程序设计的关系

刘爱贵

(高能物理研究所计算中心 北京)

摘要 递归函数论是元计算机科学理论基础,它与计算机科学的实践紧密相关。递归思想影响了程序设计语言的构造,甚至影响了计算机系统结构。本文根据递归函数类的构造过程来论证递归与程序设计语言基层控制机制的关系,以及递归思想对计算机科学其他一些方面的影响。

关键词 递归定义 复合 原始递归 极小化 结构化程序设计 递归过程 栈

<!--[if !supportEmptyParas]--><!--[endif]-->

可计算性理论是计算机科学的理论基础之一,递归函数论和图灵机是其两大理论支柱。图灵机是一种抽象计算机,它为可计算数的计算提供了强的有力的计算手段,是计算机的雏形和冯.诺 依曼计算机的理论模型,影响了传统计算机的设计思想。递归函数理论作为元计算机科学理论基础,明确了计算机可计算的对象——递归函数类。图灵论题:一个函 数是可计算的当且仅当图灵机是可计算的。而图灵机可计算的函数正是递归函数类,确切地说是一般递归函数类。图灵机和递归函数论有着天然的联系。递归函数论 与计算机科学的实践有着密切的关系,递归的思想直接影响了程序设计语言的构造,进一步影响了计算机系统的结构。

递 归是一种定义对象类的方法,这个方法称为递归定义。存在一定的原始对象,在被定义的类中,我们给出一些方法,运用这些方法要给定某些已知在类中的对象中, 可以产生类中的新对象。被定义的类中的全体成员恰好而且仅仅是那些由原始对象开始,反复使用所给定的获取新对象的规则而引进的新对象。这种定义类的方法称 为递归定义。递归函数类可以用递归来定义,它由原始对象经过复合运算、原始递归运算和极小化运算而得到。原始对象是三个最简单的原始函数:

1、继函数,S(x)=x+1

2、零函数,N(x)=0

3、广义单位函数,<!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter" /> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0" /> <v:f eqn="sum @0 1 0" /> <v:f eqn="sum 0 0 @1" /> <v:f eqn="prod @2 1 2" /> <v:f eqn="prod @3 21600 pixelWidth" /> <v:f eqn="prod @3 21600 pixelHeight" /> <v:f eqn="sum @0 0 1" /> <v:f eqn="prod @6 1 2" /> <v:f eqn="prod @7 21600 pixelWidth" /> <v:f eqn="sum @8 21600 0" /> <v:f eqn="prod @7 21600 pixelHeight" /> <v:f eqn="sum @10 21600 0" /> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" /> <o:lock v:ext="edit" aspectratio="t" /> </v:shapetype><v:shape id="_x0000_i1030" type="#_x0000_t75" style='width:111.75pt; height:18.75pt' o:ole=""> <v:imagedata src="./relationOfRecursion_progamming.files/image001.wmz" o:title="" /> </v:shape><![endif]--><!--[if !vml]--><!--[endif]--><!--[if gte mso 9]><xml> <o:OLEObject Type="Embed" ProgID="Equation.3" ShapeID="_x0000_i1030" DrawAspect="Content" ObjectID="_1206441790"> </o:OLEObject> </xml><![endif]-->(其中0in)

在这三个原始函数基础上,我们可以定义出非常丰富的函数类。运算规则有:

1、复合运算。如果已知函数

<!--[if gte vml 1]><v:shape id="_x0000_i1025" type="#_x0000_t75" style='width:149.25pt;height:92.25pt' o:ole=""> <v:imagedata src="./relationOfRecursion_progamming.files/image003.wmz" o:title="" /> </v:shape><![endif]--><!--[if !vml]--><!--[endif]--><!--[if gte mso 9]><xml> <o:OLEObject Type="Embed" ProgID="Equation.3" ShapeID="_x0000_i1025" DrawAspect="Content" ObjectID="_1206441791"> </o:OLEObject> </xml><![endif]-->

是所生成类中的成员,那么函数<!--[if gte vml 1]><v:shape id="_x0000_i1026" type="#_x0000_t75" style='width:237pt;height:18pt' o:ole=""> <v:imagedata src="./relationOfRecursion_progamming.files/image005.wmz" o:title="" /> </v:shape><![endif]--><!--[if !vml]--><!--[endif]--><!--[if gte mso 9]><xml> <o:OLEObject Type="Embed" ProgID="Equation.3" ShapeID="_x0000_i1026" DrawAspect="Content" ObjectID="_1206441792"> </o:OLEObject> </xml><![endif]-->是由这些函数通过复合运算得到的(1)

<!--[if gte vml 1]><v:shape id="_x0000_i1027" type="#_x0000_t75" style='width:390.75pt;height:75pt' o:ole=""> <v:imagedata src="./relationOfRecursion_progamming.files/image007.wmz" o:title="" /> </v:shape><![endif]--><!--[if !vml]--><!--[endif]--><!--[if gte mso 9]><xml> <o:OLEObject Type="Embed" ProgID="Visio.Drawing.6" ShapeID="_x0000_i1027" DrawAspect="Content" ObjectID="_1206441793"> </o:OLEObject> </xml><![endif]-->

1 <!--[if gte vml 1]><v:shape id="_x0000_i1028" type="#_x0000_t75" style='width:60pt;height:18pt' o:ole=""> <v:imagedata src="./relationOfRecursion_progamming.files/image009.wmz" o:title="" /> </v:shape><![endif]--><!--[if !vml]--><!--[endif]--><!--[if gte mso 9]><xml> <o:OLEObject Type="Embed" ProgID="Equation.3" ShapeID="_x0000_i1028" DrawAspect="Content" ObjectID="_1206441795"> </o:OLEObject> </xml><![endif]-->的复合计算的操作

<!--[if !supportEmptyParas]--><!--[endif]-->

2、原始递归运算。我们称将要定义的函数为r(x)。原始递归的运算包括把某种特定的值赋给r(0),和一个由已经得到的r(k)来确定r(k+1)的过程(图2)。

<!--[if gte vml 1]><v:shape id="_x0000_i1029" type="#_x0000_t75" style='width:278.25pt;height:124.5pt' o:ole=""> <v:imagedata src="./relationOfRecursion_progamming.files/image011.wmz" o:title="" /> </v:shape><![endif]--><!--[if !vml]--><!--[endif]--><!--[if gte mso 9]><xml> <o:OLEObject Type="Embed" ProgID="Visio.Drawing.6" ShapeID="_x0000_i1029" DrawAspect="Content" ObjectID="_1206441796"> </o:OLEObject> </xml><![endif]-->

2 原始递归的运算——r(x)的计算

<!--[if !supportLists]-->3、 <!--[endif]-->极小化运算。对于每一个给定的全函数<!--[if gte vml 1]><v:shape id="_x0000_i1042" type="#_x0000_t75" style='width:90pt;height:18pt' o:ole=""> <v:imagedata src="./relationOfRecursion_progamming.files/image013.wmz" o:title="" /> </v:shape><![endif]--><!--[if !vml]--><!--[endif]--><!--[if gte mso 9]><xml> <o:OLEObject Type="Embed" ProgID="Equation.3" ShapeID="_x0000_i1042" DrawAspect="Content" ObjectID="_1206441797"> </o:OLEObject> </xml><![endif]-->引进一个新函数<!--[if gte vml 1]><v:shape id="_x0000_i1043" type="#_x0000_t75" style='width:75.75pt;height:18pt' o:ole=""> <v:imagedata src="./relationOfRecursion_progamming.files/image015.wmz" o:title="" /> </v:shape><![endif]--><!--[if !vml]--><!--[endif]--><!--[if gte mso 9]><xml> <o:OLEObject Type="Embed" ProgID="Equation.3" ShapeID="_x0000_i1043" DrawAspect="Content" ObjectID="_1206441798"> </o:OLEObject> </xml><![endif]-->,对于给定的<!--[if gte vml 1]><v:shape id="_x0000_i1044" type="#_x0000_t75" style='width:69.75pt;height:18pt' o:ole=""> <v:imagedata src="./relationOfRecursion_progamming.files/image017.wmz" o:title="" /> </v:shape><![endif]--><!--[if !vml]--><!--[endif]--><!--[if gte mso 9]><xml> <o:OLEObject Type="Embed" ProgID="Equation.3" ShapeID="_x0000_i1044" DrawAspect="Content" ObjectID="_1206441799"> </o:OLEObject> </xml><![endif]-->,新函数的值为使得<!--[if gte vml 1]><v:shape id="_x0000_i1045" type="#_x0000_t75" style='width:108pt;height:18pt' o:ole=""> <v:imagedata src="./relationOfRecursion_progamming.files/image019.wmz" o:title="" /> </v:shape><![endif]--><!--[if !vml]--><!--[endif]--><!--[if gte mso 9]><xml> <o:OLEObject Type="Embed" ProgID="Equation.3" ShapeID="_x0000_i1045" DrawAspect="Content" ObjectID="_1206441800"> </o:OLEObject> </xml><![endif]-->的最小的y。记作<!--[if gte vml 1]><v:shape id="_x0000_i1046" type="#_x0000_t75" style='width:228pt;height:18pt' o:ole=""> <v:imagedata src="./relationOfRecursion_progamming.files/image021.wmz" o:title="" /> </v:shape><![endif]--><!--[if !vml]--><!--[endif]--><!--[if gte mso 9]><xml> <o:OLEObject Type="Embed" ProgID="Equation.3" ShapeID="_x0000_i1046" DrawAspect="Content" ObjectID="_1206441801"> </o:OLEObject> </xml><![endif]-->,这样的y值可能没有定义(图3)。

<!--[if gte vml 1]><v:shape id="_x0000_i1047" type="#_x0000_t75" style='width:383.25pt;height:84.75pt' o:ole=""> <v:imagedata src="./relationOfRecursion_progamming.files/image023.wmz" o:title="" /> </v:shape><![endif]--><!--[if !vml]--><!--[endif]--><!--[if gte mso 9]><xml> <o:OLEObject Type="Embed" ProgID="Visio.Drawing.6" ShapeID="_x0000_i1047" DrawAspect="Content" ObjectID="_1206441802"> </o:OLEObject> </xml><![endif]-->

3 极小化运算——由f(y,x)计算h(x)

这 三个运算能力是强有力的。原始函数通过复合生成基本递归函数类,继而根据原始递归运算生成递归函数类,再经过极小化运算即可得到部分递归函数类。由此可见 复合运算、原始递归运算和极小化运算在数学体系中的关键作用,这也使得我们推想它们在程序设计中的重要性,它们与程序基层控制机制密切相关。

构造性是计算机系统的最根本特征,也是能行过程的重要特征,而递归是最具代表性的构造性数学方法。递归函数类就是递归构造得到的,而程序是构造性证明,图灵机理论已经蕴含了程序设计的思想。我们用函数方法构造一个可计算函数f(或者等价地构造性证明f是可计算的),就等于对f进行程序设计。Turing-Church论题告诉我们:递归函数类等同于能行可计算函数。而复合运算、原始递归运算和极小化运算发挥了很关键的作用,所以旨在提供通用计算功能的计算机必须实现这些运算。程序设计语言中的许多设施都是为了构造递归函数类而设置的。过程(Procedure)和宏(Macro)为运用复合提供了明显的便利。为了应付复合和原始递归运算的定义,一些程序设计语言,如ALGOL68,还提供了以函数作为输入参数和输出结果的特殊过程。这样复合运算可以解释成提供过程的功能。极小化运算实质上包含了对具有检测出口条件的循环进行程序设计的能力,它使用了结构程序设计中的Do While运算。原始递归运算不像极小化运算的功能那样强,它也包含循环,但在某些情况下,循环次数是预先确定的,这与使用任意检测在每一步确定终止条件是否满足的情形正好相反。使用Do WhileFOR循环均可实现原始递归运算。

结构化程序设计最初由Dijkstra提出,1966G.JacopiniC.Bohn从理论上证明了:任何单入口、单出口程序仅使用序列、循环和条件三种结构就可以表示出来。这种程序设计方法采用了反复运用几个简单运算的思想,用这三种结构我们可以很方便完成递归函数理论的基本运算(4、图5、图6),从而可以表达任意计算过程。

<!--[if !supportEmptyParas]--><!--[endif]-->

  <!--[if gte vml 1]><v:shape id="_x0000_i1048" type="#_x0000_t75" style='width:411pt;height:28.5pt' o:ole=""> <v:imagedata src="./relationOfRecursion_progamming.files/image025.wmz" o:title="" /> </v:shape><![endif]--><!--[if !vml]--><!--[endif]--><!--[if gte mso 9]><xml> <o:OLEObject Type="Embed" ProgID="Visio.Drawing.6" ShapeID="_x0000_i1048" DrawAspect="Content" ObjectID="_1206441803"> </o:OLEObject> </xml><![endif]-->

4 序列运算表达的复合

<!--[if gte vml 1]><v:shape id="_x0000_i1049" type="#_x0000_t75" style='width:194.25pt;height:111.75pt' o:ole=""> <v:imagedata src="./relationOfRecursion_progamming.files/image027.wmz" o:title="" /> </v:shape><![endif]--><!--[if !vml]--><!--[endif]--><!--[if gte mso 9]><xml> <o:OLEObject Type="Embed" ProgID="Visio.Drawing.6" ShapeID="_x0000_i1049" DrawAspect="Content" ObjectID="_1206441804"> </o:OLEObject> </xml><![endif]--> <!--[if gte vml 1]><v:shape id="_x0000_i1050" type="#_x0000_t75" style='width:223.5pt;height:111pt' o:ole=""> <v:imagedata src="./relationOfRecursion_progamming.files/image029.wmz" o:title="" /> </v:shape><![endif]--><!--[if !vml]--><!--[endif]--><!--[if gte mso 9]><xml> <o:OLEObject Type="Embed" ProgID="Visio.Drawing.6" ShapeID="_x0000_i1050" DrawAspect="Content" ObjectID="_1206441805"> </o:OLEObject> </xml><![endif]-->

5 使用“Do While”的极小化 6 使用“Do while”(定义一个单自变量函数r(x))的原始递归

在原始递归中如果我们开始就知道执行的次数,则完全可以用for循环来实现。由于全函数经过极小化运算后可能不是全函数,即不存在最小y的解,从而结构程序设计中Do While循环可能出现死循环,这在程序设计中要值得注意。利用结构程序设计语言提供的控制机制,我们可以很容易构造出原始函数和复合、原始递归和极小化运算。下面是用C语言函数实现的三个原始函数和三个运算,利用这六个函数可以计算任何可计算函数,完成递归理论的运算。可见程序设计的能力和递归函数理论表达能力是相同的,函数的构造和程序设计是等价的。

<!--[if !supportLists]--> <!--[endif]-->零函数 ◆原始递归运算

int zero(int x) int recursion(int y)

{ {

return(0); int k,h;

} h=f(x1,,xn);

<!--[if !supportLists]--> <!--[endif]-->后继函数 while(y<>k)

int successor(int x) {

{ h=g(x1,,xn,k,h);

return(x+1); k++;

} }

<!--[if !supportLists]--> <!--[endif]-->广义单位函数 return(h);

int projection(int i,int x1,int x2,,int xn) }

{ ◆极小化运算

if(i==1)return(x1); int minmalisation()

if(i==2)return(x1); {

int y,k;

if(i==n)return(xn); y=0;

} k=f(x1,,xn,y);

<!--[if !supportLists]--> <!--[endif]-->复合运算 while(k<>0)

int composition() {

{ y++;

int y1,y2,,yk; k=f(x1,,xn,y);

y1=f1(x1,,xn); }

y2=f1(x1,,xn); return(y);

}

yk=f1(x1,,xn);

return(g(y1,,yk));

}

程 序设计是计算机实践的基本活动,而递归思想直接影响了程序设计的构造,它决定了程序设计语言的许多关键技术,从而递归过程、递归程序就十分自然了。简单地 说,递归过程就是自身调用自身过程,包含递归过程的程序我们称为递归程序。在程序设计中使用递归算法往往可以简化求解问题的复杂性。如著名的梵天塔问题, 这个问题只有用递归方法解决,而不能用其他方法有效求解。用递归过程描述如下:

void Hanoi(int n,char left,char middle,char right)

{

if(n==1)move(1,one,-,three);

else

{

hanoi(n-1,left,right,middle);

move(1,left,-,right);

hanoi(n-1,middle,left,right);

}

}

在编译技术中递归过程使用更为普遍,处理符号表达式递归过程尤为自然,因为这样的程序结构和数据结构相匹配。下面是Pascal语言一个子集TINY语言的文法(图7),从文法中我们可以看到许多递归结构,所以语法分析采用递归下降文法进行分析自然就很简单。我们为每一文法成分构造一个函数,这些函数之间相互调用,直接或间接就构成了递归。

<!--[if gte vml 1]><v:shape id="_x0000_i1031" type="#_x0000_t75" style='width:449.25pt;height:213.75pt' o:ole=""> <v:imagedata src="./relationOfRecursion_progamming.files/image031.png" o:title="" /> </v:shape><![endif]--><!--[if !vml]--><!--[endif]--><!--[if gte mso 9]><xml> <o:OLEObject Type="Embed" ProgID="PBrush" ShapeID="_x0000_i1031" DrawAspect="Content" ObjectID="_1206441806"> </o:OLEObject> </xml><![endif]-->

7 TINY语言的文法

递 归程序中的变量与机器中的存储单元对应,当程序被它本身调用时,它将使用相同的存储单元改写它们原先的内容。所以有了栈这样的数据结构,用来存储必须保存 的寄存器内容。这一存储在进入子程序前由调用程序完成或在子程序使用前完成。为了增强递归程序设计的效率,现在的计算机体系结构中设有硬件栈数据结构,它 由一组寄存器组成,并且用专用的指令push和pop来处理栈操作。由此可见,递归思想在计算机系统中是非常普遍的,它甚至影响了计算机的体系结构。

递 归函数理论作为计算机科学的元科学,对计算机实践具有非常重要的意义,而程序设计作为计算机科学基本的实践活动,递归思想直接影响了程序设计语言的构造, 也影响了计算机的体系结构。递归是一种普遍的思维机制,这在计算机科学的理论和实践中得到了很广泛的应用,对计算机的发展起了至关重要的作用。

[参考文献]

1、(美)F.S.Beckman 程序设计的数学基础       1991.8 科学出版社

2、(英)J.M.布雷迪  计算机科学理论-程序设计途径  1988.4 科学出版社

3、董荣胜、古天龙  计算机科学与技术方法论     2002.9 人民邮电出版社


创建日期: 2006年4月13日
<script type="text/javascript" src="http://www.goc.ac.cn/liuag/html/datestamp.js" charset="utf-8" language="JavaScript"></script> 最近更新: 2006年9月13日
分享到:
评论

相关推荐

    GNU MAKE 中文手册

    第二章:GNU make 介绍 2.1 Makefile简介 2.2 Makefile规则介绍 2.3 简单的示例 2.4 make如何工作 2.5 指定变量 2.6 自动推导规则 2.7 另类风格的makefile 2.8 清除工作目录过程文件 第三章:Makefile 总述...

    GNU-Makefile中文手册-Ver3.8.pdf

    对“info make”的翻译整理,不是一个纯粹的...中的哪些源文件需要编译以及如何编译、需要创建那些库文件以及如何创建这些库文 件、如何最后产生我们想要得可执行文件。尽管看起来可能是很复杂的事情,但是为工 程编写

    算法导论(第二版 中文高清版)

    4.2 递归树方法 4.3 主方法 4.4 主定理的证明 4.4.1 取正合幂时的证明 4.4.2 上取整函数和下取整函数 第5章 概率分析和随机算法 5.1 雇用问题 5.2 指示器随机变量 5.3 随机算法 5.4 概率分析和指示器随机变量的...

    GNU make中文手册

    第二章:GNU make 介绍 2.1 Makefile简介 2.2 Makefile规则介绍 2.3 简单的示例 2.4 make如何工作 2.5 指定变量 2.6 自动推导规则 2.7 另类风格的makefile 2.8 清除工作目录过程文件 第三章:Makefile 总述 3.1 ...

    C++和面向对象数值计算

    3.8.5 递归函数 3.8.6 内联函数 3.8.7 缺省参数 3.8.8 函数类型 3.8.9 静态局部变量 3.8.10 main函数 3.9 程序的运行空间 3.10 运算符概要及优先级 3.11 标准数学函数库 3.12 多项式求值 ...

    Java数据结构和算法中文第二版(1)

    递归的二分查找 汉诺(Hanoi)塔问题 归并排序 清除递归 一些有趣的递归应用 小结 问题 实验 编程作业 第7章 高级排序 希尔排序 划分 快速排序 基数排序 小结 问题 实验 编程作业 第8章 二叉树...

    GNU make 中文手册 网页版

    第二章:GNU make 介绍 2.1 Makefile简介 2.2 Makefile规则介绍 2.3 简单的示例 2.4 make如何工作 2.5 指定变量 2.6 自动推导规则 2.7 另类风格的makefile 2.8 清除工作目录过程文件 第三章:Makefile 总述...

    部署 pcoded Matlab 文件:创建递归 p 编码文件和相关的帮助文本,也适用于类和包-matlab开发

    解决此问题的一种方法是创建第二个文件,其名称与加密的 P 文件相同,但具有 M 文件扩展名。 此外,有必要将函数签名添加到顶部。 如果有很多文件需要更新,这会产生大量工作。 此外,必须始终在 P 文件之前创建...

    Java数据结构和算法中文第二版(2)

    递归的二分查找 汉诺(Hanoi)塔问题 归并排序 清除递归 一些有趣的递归应用 小结 问题 实验 编程作业 第7章 高级排序 希尔排序 划分 快速排序 基数排序 小结 问题 实验 编程作业 第8章 二叉树...

    Gun make中文手冊

    第二章:GNU make 介绍 2.1 Makefile简介 2.2 Makefile规则介绍 2.3 简单的示例 2.4 make如何工作 2.5 指定变量 2.6 自动推导规则 2.7 另类风格的makefile 2.8 清除工作目录过程文件 第三章:Makefile 总述...

    富士通单片机C语言手册基础篇中文版

    目录 第一章 C 语言概述 1 第一节 C 语言的特点 1 第二节 C 语言的程序结构 2 第三节 C 语言的关键字和标识符 3 第二章 C 语言的基本语法 5 第一节 数据类型 5 2 1 1 整型int 5 2 1 2 浮点型float 6 ...第三章 函数 ...

    算法导论(中文 第二版)答案

     第三章 函数的增长率(Growth of Functions)  第四章 递归(Recurrences)  第五章 概率分析与随机化算法(Probabilistic Analysis and Randomized Algorithms)  第二部分(Part II) 排序与顺序统计...

    排列问题再讨论

    第二行:n个数的序列,用来做递归的插入排序; 第三行:n个数的序列,用来做自然合并排序; 第四行:n个数的序列,用来做快速排序。 注意:第二、三、四行之间无联系,可能相同也可能不相同。 输出格式 三行,...

    C++ Primer第四版【中文高清扫描版】.pdf

    第二部分 容器和算法 第9章 顺序容器 263 9.1 顺序容器的定义 264 9.1.1 容器元素的初始化 265 9.1.2 容器内元素的类型约束 267 9.2 迭代器和迭代器范围 268 9.2.1 迭代器范围 270 9.2.2 使迭代器失效的容器操作 ...

    【推荐】GNU make中文手册

    ) 8.3.5 $(addsuffix SUFFIX,NAMES…) 8.3.6 $(addprefix PREFIX,NAMES…) 8.3.7 $(join LIST1,LIST2) 8.3.8 $(wildcard PATTERN) 8.4 foreach 函数 8.5 if 函数 8.6 call函数 8.7 value...

    aybook.cn_c++jiaocheng0105.rar

    基础知识 7.1 函数的作用域准则 7.2 传递指针和数组 7.3 argc和argv:函数main()的参数 7.4 return语句 7.5 函数原型 7.6 头文件:进一步的学习 7.7 递归 第8章 函数,第二部分:引用,重载和默认参数 8.1 两种参数...

    C语言解析教程(原书第4版)(美) 凯利.pdf

    12.5 例子:哲学家用餐问题 12.6 矩阵的动态分配 12.6.1 为什么二维数组无法满足要求 12.6.2 用指针数组创建矩阵 12.6.3 调整下标范围 12.6.4 一次分配所有内存 12.7 返回状态 12.8 总结 12.9 练习 第13章 从c到c++ ...

    javascript入门笔记

    Javascript Basic 1、Javascript 概述(了解) Javascript,简称为 JS,是一款能够运行在 JS解释器/引擎 中的脚本语言 ... 1、定义一个函数 change ,该函数中接收两个参数(a,b) 2、在函数体中,如果 a 大于 b的话...

    编译原理(第二版中文)

     4.6 与设计扫描程序相关的几个问题  4.7 小结  习题四 第5章 自上而下语法分析  5.1 非确定的下推自动机  5.2 消除左递归方法  5.3 LL(k)文法  5.4 确定的LL(1)分析器的构造  5.5 LL(k)文法的几个...

Global site tag (gtag.js) - Google Analytics