树用递归方便,用其它方法好像跟本不可能.
递归用在特定的函数如 f(x)= f(x-1) + 2
像这种情况,你想算出f(x)就必需算出f(x-1),而f(x)和f(x-1)实际上都是用共一个方法,只是参数相差一.这种时候用递归就很快.
这个题做法大概是这样:
这个人传球通常是向左或向右传,于是采用递归算法:
定义球的位置为i,剩余次数为j,
每次都会向左或向右传,i从1开始向左向右传:
因为是一个圈,所以当i=1,向左时,i:=n;
而i向右时,i:=i+1;
同理继续开辟内存空间,这个函数可以这样表达:
f(i,j)=情况一:if j>0 and i=1 then f:=f(n,j-1)+f(2,j-1);
情况二:if j>0 and i=n then f:=f(n-1,j-1)+f(1,j-1);
情况三:if j>0 and (i<>1 and i<>n) then f(i,j):=f(i-1,j-1)+f(i+1,j-1);
情况四:if j=0 then if i=1 then f=1 else f=0;
主干就是这些,下面给出他的源程序(这是我的一个想法,不是标准程序)
program ball;
var m,n:integer;
function f(i:integer,j:integer):longint;//递归子程序//
begin
if (j>0) and (i=1) then f:=f(n,j-1)+f(2,j-1);
if (j>0) and (i=n) then f:=f(n-1,j-1)+f(1,j-1);
if (j>0) and (i<>1) and (i<>n) then f:=f(i-1,j-1)+f(i+1,j-1);
if (j=0) then if i=1 then f:=1 else f:=0;
end;
begin
readln(n,m);
writeln(f(1,m));
end//这个程序过不了几个测试点,算法不好//
这个其实应该有解题报告了,那上面的程序要好很多
以上就是关于什么时候该用到递归全部的内容,包括:什么时候该用到递归、pascal问题求教啊!!救命!、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)