递归算法经典实例法

14141人阅读
递归算法设计的基本思想是:对于一个复杂的问题,把原问题分解为若干个相对简单类同的子问题,继续下去直到子问题简单到能够直接求解,也就是说到了递推的出口,这样原问题就有递推得解。 关键要抓住的是: (1)递归出口 (2)地推逐步向出口逼近 例子: example: 求5的阶乘。。&&&&&& && 如下:&&& &&
public&class&Test&{&&&&&& &&
static&int&multiply(int&n){&&&&&& &&
if(n==1||n==0)&&&&&& &&
return&n;&&&&&& &&
else&&&&&& &&
return&n*multiply(n-1);&&&&&& &&
}&&&&&& &&
public&static&void&main(String[]&args){&&&&&& &&
System.out.println(multiply(10));&&&&&& &&
}&&&&&& &&
public class Test {
static int multiply(int n){
if(n==1||n==0)
return n*multiply(n-1);
public static void main(String[] args){
System.out.println(multiply(10));
&& && 上面的multiply是一个阶乘的例子。其实递归递归,从字面上解释就是在方法本身调用自己的方法,或者间接调用;看上面的程序,拿multiply(5)来说:&&& n=5;执行 5*multiply(4);&&& --------------------&&& 这时候看multiply(4)&&& n=4 执行 4*multiply(3);&&& -------------------&&& 看multiply(3)&&& n=3,执行 3*multiply(2);&&& ---------------&&& mulitply(2);&&& n=2 执行 2*mulitply(1);&&& 这时候,return 1;往上返回&&& 2*1向上返回&&& 3*(2*1)向上返回&&& 4*(3*(2*1)) 向上返回&&& 5*(4*(3*(2*1)) ) = 120&&& 所以程序输出120;&&& 这事简单的递归的例子;所以可以看出来递归的关键得有递归出口(本体的If语句),还有递归方法;&&& 以下是我在百度知道碰到一个朋友的提问,也是关于递归算法的: ------------------------问题------------------------------ 本人刚学JAVA,没有任何编程基础,各位高手见笑。
public&class&Count &&
&&&&static&void&count(int&n)&&&&&&&&&&&&&&&&&
&&&&&&&&if&(n&5)& &&
&&&&&&&&&&&&count(n+1);& &&
&&&&&&&&System.out.print("&&&&&"+n); &&
&&&&public&static&void&main(String&args[]) &&
&&&&&&&&count(1); &&
&&&&&&&&System.out.println(); &&
public class Count
static void count(int n)
//递归方法
count(n+1);
System.out.print("
public static void main(String args[])
System.out.println();
请详细讲解这段程序是怎么执行的,我的理解是先执行main函数里的count(1),然后进入count方法,N值为1,所以执行IF语句,直到count(5),此时退出if 循环,打印N=5 ,然后应该没有要执行的东西了,可是答案是5&&&& 4&&&& 3&&&& 2&&&& 1 ,请问这是怎么回事,谢谢! --------------------回答--------------------------- 先执行count(1),然后进入count方法,N值为1,所以执行IF语句,也就是执行count(2),然后进入count方法,N值为2,所以执行IF语句,也就是执行count(3),然后进入count方法,N值为3,所以执行IF语句,也就是执行count(4),然后进入count方法,N值为4,所以执行IF语句,也就是执行count(5),然后进入count方法,N值为5,所以不执行IF语句,然后执行System.out.print(" "+n); 也就是输出5,然后本次参数为5的count方法调用结束了,返回到调用它的参数为4的count方法中,然后执行System.out.print(" "+n);输出4,然后一直这样下去,输出3,2,1 。这里需要说明的是在执行count(5)的时候,count(4)、count(3)、count(2)、count(1)都没有执行完毕,他们都在等自己方法体中的count(n+1)执行完毕,然后再执行System.out.print(" "+n);
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:32519次
排名:千里之外
转载:24篇
评论:11条
(1)(1)(8)(6)(1)(1)(2)(2)(4)(2)(2)(3)[精华] 八皇后问题递归算法 + Pascal 程序 - ChinaUnix.net
[精华] 八皇后问题递归算法 + Pascal 程序
http://www.chinaunix.net 作者:&&发表于: 14:19:10
[这个贴子最后由cinc在&&01:58pm&编辑]在网上找到的一个&八皇后问题的&pascal&解法。可以参考参考:八皇后问题--------------------------------------------------------------------------------〖问题描述〗在一个8×8的棋盘里放置8个皇后,要求每个皇后两两之间不相&冲&(在每一横列竖列斜列只有一个皇后)。〖问题分析〗(聿怀中学&吕思博)这道题可以用递归循环来做,分别一一测试每一种摆法,直到得出正确的答案。主要解决以下几个问题:1、冲突。包括行、列、两条对角线:(1)列:规定每一列放一个皇后,不会造成列上的冲突;(2)行:当第I行被某个皇后占领后,则同一行上的所有空格都不能再放皇后,要把以I为下标的标记置为被占领状态;(3)对角线:对角线有两个方向。在同一对角线上的所有点(设下标为(i,j)),要么(i+j)是常数,要么(i-j)是常数。因此,当第I个皇后占领了第J列后,要同时把以(i+j)、(i-j)为下标的标记置为被占领状态。2、数据结构。(1)解数组A。A[I]表示第I个皇后放置的列;范围:1..8(2)行冲突标记数组B。B[I]=0表示第I行空闲;B[I]=1表示第I行被占领;范围:1..8(3)对角线冲突标记数组C、D。C[I-J]=0表示第(I-J)条对角线空闲;C[I-J]=1表示第(I-J)条对角线被占领;范围:-7..7D[I+J]=0表示第(I+J)条对角线空闲;D[I+J]=1表示第(I+J)条对角线被占领;范围:2..16〖算法流程〗1、数据初始化。2、从n列开始摆放第n个皇后(因为这样便可以符合每一竖列一个皇后的要求),先测试当前位置(n,m)是否等于0(未被占领):如果是,摆放第n个皇后,并宣布占领(记得要横列竖列斜列一起来哦),接着进行递归;如果不是,测试下一个位置(n,m+1),但是如果当n&=8,m=8时,却发现此时已经无法摆放时,便要进行回溯。3、当n&;8时,便一一打印出结果。〖优点〗逐一测试标准答案,不会有漏网之鱼。〖参考程序〗queen.pas----------------------------------------------------------------------------program&tt&#59;var&a:array&[1..8]&of&integer&#59;&&&b,c,d:array&[-7..16]&of&integer&#59;&&&t,i,j,k:integer&#59;procedure&print&#59;begin&&&&&t:=t+1&#59;&&&&&write(t,'&&&&&&&')&#59;&&&&&for&k:=1&to&8&do&write(a[k],'&&&')&#59;&&&&&writeln&#59;end&#59;procedure&try(i:integer)&#59;var&j:integer&#59;begin&&&&for&j:=1&to&8&do&{每个皇后都有8种可能位置}&&&&&&&&&if&(b[j]=0)&and&(c[i+j]=0)&and&(d[i-j]=0)&then&{判断位置是否冲突}&&&&&&&&&begin&&&&&&&&&&&&&&&a:=j&#59;&{摆放皇后}&&&&&&&&&&&&&&&b[j]:=1&#59;&{宣布占领第J行}&&&&&&&&&&&&&&&c[i+j]:=1&#59;&{占领两个对角线}&&&&&&&&&&&&&&&d[i-j]:=1&#59;&&&&&&&&&&&&&&&if&i&8&then&try(i+1)&{8个皇后没有摆完,递归摆放下一皇后}&&&&&&&&&&&&&&&&&&&&&&&else&print&#59;&&{完成任务,打印结果}&&&&&&&&&&&&&&b[j]:=0&#59;&&&&{回溯}&&&&&&&&&&&&&&c[i+j]:=0&#59;&&&&&&&&&&&&&&d[i-j]:=0&#59;&&&&&&&&&end&#59;end&#59;begin&&&&for&k:=-7&to&16&do&{数据初始化}&&&&begin&&&&&&&&&b[k]:=0&#59;&&&&&&&&&c[k]:=0&#59;&&&&&&&&&d[k]:=0&#59;&&&&end&#59;&&&&try(1)&#59;{从第1个皇后开始放置}end.----------------------------------------------------------------------------
& 回复于: 14:19:10
呵呵,有谁愿意,可以把他用&Java&实现看看。。。:)
原文链接:
转载请注明作者名及原文出处posts - 39,&
comments - 3,&
trackbacks - 0
/xxciof/blog/static// oracle中 connect by prior 递归算法 Oracle中start with...connect by prior子句用法 connect by 是结构化查询中用到的,其基本语法是: select ... from tablename start with 条件1 connect by 条件2 where 条件3; 例: select * from table start with org_id = 'HBHqfWGWPy' connect by prior org_id = parent_ &&&& 简单说来是将一个树状结构存储在一张表里,比如一个表中存在两个字段: org_id,parent_id那么通过表示每一条记录的parent是谁,就可以形成一个树状结构。 &&&& 用上述语法的查询可以取得这棵树的所有记录。 &&&& 其中: &&&& 条件1 是根结点的限定语句,当然可以放宽限定条件,以取得多个根结点,实际就是多棵树。 &&&& 条件2 是连接条件,其中用PRIOR表示上一条记录,比如 CONNECT BY PRIOR org_id = parent_id就是说上一条记录的org_id 是本条记录的parent_id,即本记录的父亲是上一条记录。 &&&& 条件3 是过滤条件,用于对返回的所有记录进行过滤。 &&&& 简单介绍如下: &&&& 早扫描树结构表时,需要依此访问树结构的每个节点,一个节点只能访问一次,其访问的步骤如下: &&&& 第一步:从根节点开始; &&&& 第二步:访问该节点; &&&& 第三步:判断该节点有无未被访问的子节点,若有,则转向它最左侧的未被访问的子节,并执行第二步,否则执行第四步; &&&& 第四步:若该节点为根节点,则访问完毕,否则执行第五步; &&&& 第五步:返回到该节点的父节点,并执行第三步骤。 &&&& 总之:扫描整个树结构的过程也即是中序遍历树的过程。 &&&& 1. 树结构的描述 树结构的数据存放在表中,数据之间的层次关系即父子关系,通过表中的列与列间的关系来描述,如EMP表中的EMPNO和MGR。EMPNO表示该雇员的编号,MGR表示领导该雇员的人的编号,即子节点的MGR值等于父节点的EMPNO值。在表的每一行中都有一个表示父节点的MGR(除根节点外),通过每个节点的父节点,就可以确定整个树结构。 在SELECT命令中使用CONNECT BY 和蔼START WITH 子句可以查询表中的树型结构关系。其命令格式如下: SELECT 。。。 CONNECT BY {PRIOR 列名1=列名2|列名1=PRIOR 裂名2} [START WITH]; 其中:CONNECT BY子句说明每行数据将是按层次顺序检索,并规定将表中的数据连入树型结构的关系中。PRIORY运算符必须放置在连接关系的两列中某一个的前面。对于节点间的父子关系,PRIOR运算符在一侧表示父节点,在另一侧表示子节点,从而确定查找树结构是的顺序是自顶向下还是自底向上。在连接关系中,除了可以使用列名外,还允许使用列表达式。START WITH 子句为可选项,用来标识哪个节点作为查找树型结构的根节点。若该子句被省略,则表示所有满足查询条件的行作为根节点。 START WITH: 不但可以指定一个根节点,还可以指定多个根节点。 2. 关于PRIOR 运算符PRIOR被放置于等号前后的位置,决定着查询时的检索顺序。 PRIOR被置于CONNECT BY子句中等号的前面时,则强制从根节点到叶节点的顺序检索,即由父节点向子节点方向通过树结构,我们称之为自顶向下的方式。如: CONNECT BY PRIOR EMPNO=MGR PIROR运算符被置于CONNECT BY 子句中等号的后面时,则强制从叶节点到根节点的顺序检索,即由子节点向父节点方向通过树结构,我们称之为自底向上的方式。例如: CONNECT BY EMPNO=PRIOR MGR 在这种方式中也应指定一个开始的节点。 3. 定义查找起始节点 &&&& 在自顶向下查询树结构时,不但可以从根节点开始,还可以定义任何节点为起始节点,以此开始向下查找。这样查找的结果就是以该节点为开始的结构树的一枝。 4.使用LEVEL 在具有树结构的表中,每一行数据都是树结构中的一个节点,由于节点所处的层次位置不同,所以每行记录都可以有一个层号。层号根据节点与根节点的距离确定。不论从哪个节点开始,该起始根节点的层号始终为1,根节点的子节点为2, 依此类推。 5.节点和分支的裁剪 在对树结构进行查询时,可以去掉表中的某些行,也可以剪掉树中的一个分支,使用WHERE子句来限定树型结构中的单个节点,以去掉树中的单个节点,但它却不影响其后代节点(自顶向下检索时)或前辈节点(自底向顶检索时)。 6.排序显示 象在其它查询中一样,在树结构查询中也可以使用ORDER BY 子句,改变查询结果的显示顺序,而不必按照遍历树结构的顺序
阅读(...) 评论()尾递归_百度百科
关闭特色百科用户权威合作手机百科
收藏 查看&尾递归
如果一个函数中所有递归形式的调用都出现在函数的末尾,我们称这个递归函数是尾递归的。当递归调用是整个函数体中最后执行的语句且它的返回值不属于表达式的一部分时,这个递归调用就是尾递归。尾递归函数的特点是在回归过程中不用做任何操作,这个特性很重要,因为大多数现代的编译器会利用这种特点自动生成优化的代码。检测到时它就覆盖当前的活动记录编译器可以做到这点
当编译器检测到一个函数调用是尾递归的时候,它就覆盖当前的活动记录而不是在栈中去创建一个新的。编译器可以做到这点,因为递归调用是当前活跃期内最后一条待执行的语句,于是当这个调用返回时栈帧中并没有其他事情可做,因此也就没有保存栈帧的必要了。通过覆盖当前的栈帧而不是在其之上重新添加一个,这样所使用的栈空间就大大缩减了,这使得实际的运行效率会变得更高。虽然编译器能够优化尾递归造成的栈溢出问题,但是在编程中,我们还是应该尽量避免尾递归的出现,因为所有的尾递归都是可以用简单的goto循环替代的。为了理解尾递归是如何工作的,让我们再次以递归的形式计算阶乘。首先,这可以很容易让我们理解为什么之前所定义的递归不是尾递归。回忆之前对计算n!的定义:在每个活跃期计算n倍的(n-1)!的值,让n=n-1并持续这个过程直到n=1为止。这种定义不是尾递归的,因为每个活跃期的返回值都依赖于用n乘以下一个活跃期的返回值,因此每次调用产生的栈帧将不得不保存在栈上直到下一个子调用的返回值确定。现在让我们考虑以尾递归的形式来定义计算n!的过[1]程。
这种定义还需要接受第二个参数a,除此之外并没有太大区别。a(初始化为1)维护递归层次的深度。这就让我们避免了每次还需要将返回值再乘以n。然而,在每次递归调用中,令a=na并且n=n-1。继续递归调用,直到n=1,这满足结束条件,此时直接返回a即可。
代码实例3-2给出了一个C函数facttail,它接受一个整数n并以尾递归的形式计算n的阶乘。这个函数还接受一个参数a,a的初始值为1。facttail使用a来维护递归层次的深度,除此之外它和fact很相似。读者可以注意一下函数的具体实现和尾递归定义的相似之处。
示例3-2:以尾递归的形式计算阶乘的一个函数实现[1]
/*facttail.c*/
#include&facttail.h&
/*facttail*/
intfacttail(intn,inta)
/*Computeafactorialinatail-recursivemanner.*/
elseif(n==0)
elseif(n==1)
returnfacttail(n-1,n*a);
示例3-2中的函数是尾递归的,因为对facttail的单次递归调用是函数返回前最后执行的一条语句。在facttail中碰巧最后一条语句也是对facttail的调用,但这并不是必需的。换句话说,在递归调用之后还可以有其他的语句执行,只是它们只能在递归调用没有执行时才可以执行[1]。
尾递归是极其重要的,不用尾递归,函数的堆栈耗用难以估量,需要保存很多中间函数的堆栈。比如f(n, sum) = f(n-1) + value(n) + 会保存n个函数调用堆栈,而使用尾递归f(n, sum) = f(n-1, sum+value(n)); 这样则只保留后一个函数堆栈即可,之前的可优化删去。
也许在C语言中有很多的特例,但编程语言不只有C语言,在函数式语言Erlang中(亦是栈语言),如果想要保持语言的高并发特性,就必须用尾递归来替代传统的递归。
原文的说法是错误的:原文如下:
一种算法, 用于计算机编程技术.
尾递归是针对传统的递归算法而言的, 传统的递归算法在很多时候被视为洪水猛兽. 它的名声狼籍, 好像永远和低效联系在一起.
尾递归就是从最后开始计算, 每递归一次就算出相应的结果, 也就是说, 函数调用出现在调用者函数的尾部, 因为是尾部, 所以根本没有必要去保存任何局部变量. 直接让被调用的函数返回时越过调用者, 返回到调用者的调用者去.
以下是具体实例:
long Rescuvie(long n) {
return(n == 1) ? 1 : n * Rescuvie(n - 1);
long TailRescuvie(long n, long a) {
return(n == 1) ? a : TailRescuvie(n - 1, a * n);
long TailRescuvie(long n) {//封装用的
return(n == 0) ? 1 : TailRescuvie(n, 1);
对于线性递归, 他的递归过程如下:
Rescuvie(5)
{5 * Rescuvie(4)}
{5 * {4 * Rescuvie(3)}}
{5 * {4 * {3 * Rescuvie(2)}}}
{5 * {4 * {3 * {2 * Rescuvie(1)}}}}
{5 * {4 * {3 * {2 * 1}}}}
{5 * {4 * {3 * 2}}}
{5 * {4 * 6}}
对于尾递归, 他的递归过程如下:
TailRescuvie(5)
TailRescuvie(5, 1)
TailRescuvie(4, 5)
TailRescuvie(3, 20)
TailRescuvie(2, 60)
TailRescuvie(1, 120)
很容易看出, 普通的线性递归比尾递归更加消耗资源, 在实现上说, 每次重复的过程
调用都使得调用链条不断加长. 系统不得不使用栈进行数据保存和恢复.而尾递归就
不存在这样的问题, 因为他的状态完全由n和a保存.
具体事例2 快速排序算法实施尾递归优化
void quickSort(SqList * list , int low ,int high)
while(low&high)
pivot=Partition(list,low,high);
quickSort(list, low,pivot - 1);
//quickSort(list,low,pivot-1); 原递归调用
//quickSort(list,pivot+1,high);
low = pivot+1; /*尾递归*/
首先:尾递归是线性递归的子集,属于线性递归。具体概念请参阅各大高校出版的书籍。作者把概念搞错了
其次,上文所举的第二个例子中在TailRescuvie(n-1, 1)没有计算出来之前,是不能return的。也就是说递归过程和第一个例子是差不多的,根本没有节约资源,甚至更浪费。
其实,编译器会很容易的对尾递归使用跳转语句进行优化,其实是可以return的。
尾递归就是把当前的运算结果(或路径)放在参数里传给下层函数,深层函数所面对的不是越来越简单的问题,而是越来越复杂的问题——因为参数里带有前面若干步的运算路径。对于阶乘而言,越深并不意味着越复杂。
从时间和空间效率上看,尾递归和传统递归差不多。递归运算效率低主要是分支巨大,像阶乘这类单分支的递归,效率并不低。递归运算的深度和运算总量大致成指数关系,return多次并不会造成显著的性能损失。
一言以蔽之,传统递归越深,距离目标越近;尾递归越深,距离起点越远。
尾递归适用于运算对当前递归路径有依赖的问题,传统递归适用于运算对更深层递归有依赖的问题。
/**************************************************************************************************/
第二作者对第二个例子的解释上有点不全面,尾递归的效果就是去除了将下层的结果再次返回给上层,需要上层继续计算才得出结果的弊端,如果读者仔细观看第二例子就可以看出,其实每个递归的结果是存储在第二个参数a中的,到最后一次计算的时候,会只返回一个a的值,但是因为是递归的原理虽然仍然要返回给上层,依次到顶部才给出结果,但是不需要再做计算了,这点的好处就是每次分配的内存不会因为递归而扩大。
在效率上,两者的确差不多。
新手上路我有疑问投诉建议参考资料 查看递归 递归算法
程序调用自身的技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。递归有直接递归和间接递归
&直接递归:函数在执行过程中调用本身。
&间接递归:函数在执行过程中调用其它函数再经过这些函数调用本身。
&表达方式:
&递归算法有四个特性:
(1)必须有可最终达到的终止条件,否则程序将陷入无穷循环;
(2)子问题在规模上比原问题小,或更接近终止条件;
(3)子问题可通过再次递归调用求解或因满足终止条件而直接求解;
(4)子问题的解应能组合为整个问题的解。
下面将从以下几个典型的例子来讲解递归算法:
汉诺塔问题
如图,汉诺塔问题是指有三根杆子A,B,C。C杆上有若干碟子,把所有碟子从C杆上移到B杆上,每次只能移动一个碟子,大的碟子不能叠在小的碟子上面。求最少要移动多少次?
Move &1 &from &A &to &C
Move &1 &from &A &to &B
Move &2 &from &A &to &C
Move &1 &from &B &to &C
Move &1 &from &A &to &C
Move &2 &from &A &to &B
Move &1 &from &C &to &B
Move &3 &from &A &to &C
Move &1 &from &B &to &A
Move &2 &from &B &to &C
Move &1 &from &A &to &C
static StringBuffer str = new StringBuffer(); &
& & &* //汉诺塔问题&
& & &* @param n 盘子的个数&
& & &* @param x 将要移动盘子柱子&
& & &* @param y 要借用的柱子&
& & &* @param z 要移动到的柱子&
& & &* @return&
& & public static String hanio(int n, Object x, Object y, Object z) { &
& & & & //String str =&&; &
& & & & if(1 == n) &&
& & & & & & str.append(move(x, n, z) + &\n&); &
& & & & else { &
& & & & & & hanio(n-1, x, z, y); &
& & & & & & str.append(move(x, n, z) + &\n&) ; &
& & & & & & hanio(n-1, y, x, z); &
& & & & } &
& & & & return str.toString(); &
& & private static String move(Object x, int n, Object y) { &
& & & & //System.out.println(&Move && + n + & &from && + x + & &to && + y); &
& & & & return &Move && + n + & &from && + x + & &to && + &
fibonacci数列
斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、&&在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n&=2,n&N*)
& & &* fibonacci数列&
& & &* @param n&
& & &* @return&
& & public static long fibonacci(int n) { &
& & & & if((0 == n) || (1 == n)) { &
& & & & & & &
& & & & }else { &
& & & & & & return fibonacci(n-1) + fibonacci(n-2); &
& & & & } &
1加到n累加
用递归实现从1加到n,即1+2+3+4+...+n。
& & &* 累加,从1加到n,即1+2+3+4+...+n&
& & &* @param n 要累加到的数值&
& & &* @return 累加的结果&
& & public static long total(int n) { &
& & & & if(1 == n) { &
& & & & & & &
& & & & }else { &
& & & & & & return total(n-1) + &
& & & & } &
从1到n累积
用递归实现,从1到n累积,即1*2*3*...*n
& & &* 从1到n的累积,即1*2*3*...*n&
& & &* @param n 要累乖到的数值&
& & &* @return&
& & public static long accumulate(int n) { &&
& & & & if(1 == n) { &
& & & & & & &
& & & & }else { &
& & & & & & return accumulate(n-1) * &
& & & & } &
求数组中的最大值
用递归算法求数组中的最大值。
& & &* 用递归算法求数组中的最大值&
& & &* @param a 数组&
& & &* @param low 数组下标&
& & &* @param heigh 数组上标&
& & &* @return&
& & public static int Max(int[] a, int low, int heigh) { &
& & & & if(low & heigh-2) { &
& & & & & & if(a[low] & a[heigh]) max = a[low]; &
& & & & & & else max = a[heigh]; &
& & & & }else { &
& & & & & & int mid = (low + heigh)/2; &
& & & & & & int max1 = Max(a, low, mid); &
& & & & & & int max2 = Max(a, mid+1, heigh); &
& & & & & & max = max1&max2 ? max1 : max2; &
& & & & } &
数字塔问题
用递归算法求解数字塔问题。
2 & & &2 & & &
2 & & &2 & & &
3 & & &3 & & &3 &&
2 & & &2 & & &
3 & & &3 & & &3 & & &
4 & & &4 & & &4 & & &4 & &
& & &* 用递归算法求解数字塔问题&
& & &* @param n 数字塔的行数&
& & &* @return 数字塔的字符串&
& & public static String tourData(int n) { &
& & & & String str = new String(); &
& & & & if(1 == n) { &
& & & & & & str = rowData(n) + &\n&; &
& & & & & & &
& & & & } &
& & & & else { &
& & & & & & str = tourData(n-1) + rowData(n) + &\n&; &
& & & & } &
& & private static String rowData(int n) { &
& & & & String str = new String(); &
& & & & for(int i=0; i&n; i++) { &
& & & & & & str = str+ n + & & & &&; &
& & & & } &
您对本文章有什么意见或着疑问吗?请到您的关注和建议是我们前行的参考和动力&&
您的浏览器不支持嵌入式框架,或者当前配置为不显示嵌入式框架。

我要回帖

更多关于 递归函数 的文章

 

随机推荐