欢迎来到天天文库
浏览记录
ID:18890879
大小:49.50 KB
页数:15页
时间:2018-09-26
《函数的递归调用与分治策略》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、函数的递归调用与分治策略.txt和英俊的男人握握手,和深刻的男人谈谈心,和成功的男人多交流,和普通的男人过日子。函数的递归调用与分治策略递归方法是算法和程序设计中的一种重要技术。递归方法即通过函数或过程调用自身将问题转化为本质相同但规模较小的子问题。递归方法具有易于描述和理解、证明简单等优点,在动态规划、贪心算法、回溯法等诸多算法中都有着极为广泛的应用,是许多复杂算法的基础。递归方法中所使用的“分而治之”的策略也称分治策略。递归方法的构造构造递归方法的关键在于建立递归关系。这里的递归关系可以是递归描述的,也可以是递推描述的。下
2、面由一个求n的阶乘的程序为例,总结出构造递归方法的一般步骤。[例1]从键盘输入正整数N(0<=N<=20),输出N!。[分析]N!的计算是一个典型的递归问题。使用递归方法来描述程序,十分简单且易于理解。[步骤1]描述递归关系递归关系是这样的一种关系。设{U1,U2,U3,…,Un…}是一个序列,如果从某一项k开始,Un和它之前的若干项之间存在一种只与n有关的关系,这便称为递归关系。注意到,当N>=1时,N!=N*(N-1)!(N=1时,0!=1),这就是一种递归关系。对于特定的K!,它只与K与(K-1)!有关。[步骤2]确定递
3、归边界在步骤1的递归关系中,对大于k的Un的求解将最终归结为对Uk的求解。这里的Uk称为递归边界(或递归出口)。在本例中,递归边界为k=0,即0!=1。对于任意给定的N!,程序将最终求解到0!。确定递归边界十分重要,如果没有确定递归边界,将导致程序无限递归而引起死循环。例如以下程序:#includeintf(intx){return(f(x-1));}main(){cout<4、界统一起来用数学语言来表示,即N*(N-1)!当N>=1时n!=1当N=0时再将这种关系翻译为代码,即一个函数:longf(intn){if(n==0)return(1);elsereturn(n*f(n-1));}[步骤4]完善程序主要的递归函数已经完成,将程序依题意补充完整即可。//ex1.cpp#includelongf(intn){if(n==0)return(1);elsereturn(n*f(n-1));}main(){intn;cin>>n;cout<5、造一个递归方法基本步骤,即描述递归关系、确定递归边界、写出递归函数并译为代码,最后将程序完善。以下继续引用一些例子来讨论递归方法的应用。经典递归问题以下讨论两个十分经典的递归问题。它们的算法构造同样遵循刚刚得出的四个步骤。了解这两个问题可加深对递归方法的理解。[例2]Fibonacci数列(兔子繁殖)问题:已知无穷数列A,满足:A(1)=A(2)=1,A(N)=A(N-1)+A(N-2)(N>=3)。从键盘输入N,输出A(N)。[分析]递归关系十分明显,由A(N)的表达式给出。需要注意的是本例中对于N>=3,A(N)的值与A(6、N-1)和A(N-2)都有关。[代码]//ex2.cpp#includelongfibonacci(intx){if((x==1)7、8、(x==2))return(1);elsereturn(fibonacci(x-1)+fibonacci(x-2));}main(){intn;cin>>n;cout>>endl>>fibonacci(n);}[例3]Hanoi塔问题。[问题描述]在霍比特人的圣庙里,有一块黄铜板,上面插着3根宝石针(分别为A号,B号和C号)。在A号针上从下到上套着从大到小的n个圆形金片。9、现要将A针上的金片全部移到C针上,且仍按照原来的顺序叠置。移动的规则如下:这些金片只能在3根针间移动,一次只能一片,且任何时候都不允许将较大的金片压在较小的上面。从键盘输入n,要求给出移动的次数和方案。[分析]由金片的个数建立递归关系。当n=1时,只要将唯一的金片从A移到C即可。当n>1时,只要把较小的(n-1)片按移动规则从A移到B,再将剩下的最大的从A移到C(即中间“借助”B把金片从A移到C),再将B上的(n-1)个金片按照规则从B移到C(中间“借助”A)。本题的特点在于不容易用数学语言写出具体的递归函数,但递归关系明显,10、仍可用递归方法求解。[代码]//ex3.cpp#includehanoi(intn,chart1,chart2,chart3){if(n==1)cout<<"1"<
4、界统一起来用数学语言来表示,即N*(N-1)!当N>=1时n!=1当N=0时再将这种关系翻译为代码,即一个函数:longf(intn){if(n==0)return(1);elsereturn(n*f(n-1));}[步骤4]完善程序主要的递归函数已经完成,将程序依题意补充完整即可。//ex1.cpp#includelongf(intn){if(n==0)return(1);elsereturn(n*f(n-1));}main(){intn;cin>>n;cout<5、造一个递归方法基本步骤,即描述递归关系、确定递归边界、写出递归函数并译为代码,最后将程序完善。以下继续引用一些例子来讨论递归方法的应用。经典递归问题以下讨论两个十分经典的递归问题。它们的算法构造同样遵循刚刚得出的四个步骤。了解这两个问题可加深对递归方法的理解。[例2]Fibonacci数列(兔子繁殖)问题:已知无穷数列A,满足:A(1)=A(2)=1,A(N)=A(N-1)+A(N-2)(N>=3)。从键盘输入N,输出A(N)。[分析]递归关系十分明显,由A(N)的表达式给出。需要注意的是本例中对于N>=3,A(N)的值与A(6、N-1)和A(N-2)都有关。[代码]//ex2.cpp#includelongfibonacci(intx){if((x==1)7、8、(x==2))return(1);elsereturn(fibonacci(x-1)+fibonacci(x-2));}main(){intn;cin>>n;cout>>endl>>fibonacci(n);}[例3]Hanoi塔问题。[问题描述]在霍比特人的圣庙里,有一块黄铜板,上面插着3根宝石针(分别为A号,B号和C号)。在A号针上从下到上套着从大到小的n个圆形金片。9、现要将A针上的金片全部移到C针上,且仍按照原来的顺序叠置。移动的规则如下:这些金片只能在3根针间移动,一次只能一片,且任何时候都不允许将较大的金片压在较小的上面。从键盘输入n,要求给出移动的次数和方案。[分析]由金片的个数建立递归关系。当n=1时,只要将唯一的金片从A移到C即可。当n>1时,只要把较小的(n-1)片按移动规则从A移到B,再将剩下的最大的从A移到C(即中间“借助”B把金片从A移到C),再将B上的(n-1)个金片按照规则从B移到C(中间“借助”A)。本题的特点在于不容易用数学语言写出具体的递归函数,但递归关系明显,10、仍可用递归方法求解。[代码]//ex3.cpp#includehanoi(intn,chart1,chart2,chart3){if(n==1)cout<<"1"<
5、造一个递归方法基本步骤,即描述递归关系、确定递归边界、写出递归函数并译为代码,最后将程序完善。以下继续引用一些例子来讨论递归方法的应用。经典递归问题以下讨论两个十分经典的递归问题。它们的算法构造同样遵循刚刚得出的四个步骤。了解这两个问题可加深对递归方法的理解。[例2]Fibonacci数列(兔子繁殖)问题:已知无穷数列A,满足:A(1)=A(2)=1,A(N)=A(N-1)+A(N-2)(N>=3)。从键盘输入N,输出A(N)。[分析]递归关系十分明显,由A(N)的表达式给出。需要注意的是本例中对于N>=3,A(N)的值与A(
6、N-1)和A(N-2)都有关。[代码]//ex2.cpp#includelongfibonacci(intx){if((x==1)
7、
8、(x==2))return(1);elsereturn(fibonacci(x-1)+fibonacci(x-2));}main(){intn;cin>>n;cout>>endl>>fibonacci(n);}[例3]Hanoi塔问题。[问题描述]在霍比特人的圣庙里,有一块黄铜板,上面插着3根宝石针(分别为A号,B号和C号)。在A号针上从下到上套着从大到小的n个圆形金片。
9、现要将A针上的金片全部移到C针上,且仍按照原来的顺序叠置。移动的规则如下:这些金片只能在3根针间移动,一次只能一片,且任何时候都不允许将较大的金片压在较小的上面。从键盘输入n,要求给出移动的次数和方案。[分析]由金片的个数建立递归关系。当n=1时,只要将唯一的金片从A移到C即可。当n>1时,只要把较小的(n-1)片按移动规则从A移到B,再将剩下的最大的从A移到C(即中间“借助”B把金片从A移到C),再将B上的(n-1)个金片按照规则从B移到C(中间“借助”A)。本题的特点在于不容易用数学语言写出具体的递归函数,但递归关系明显,
10、仍可用递归方法求解。[代码]//ex3.cpp#includehanoi(intn,chart1,chart2,chart3){if(n==1)cout<<"1"<
此文档下载收益归作者所有