讨论 / 此题为什么用递归最后两个数据就会栈溢出??
caiweiwenjs 2009-11-11 02:23:00
点我顶贴 收藏 删除
如题!

我的递归:

k一开始是2

procedure work(k:longint);

begin

if k=1 then exit

else

begin

inc(ans);

if k<=n then

work(2*k)

else

work(2*(k-n)-1);

end;

end;

#1 zrp@2009-07-08 00:27:00
回复 删除
你还是别递归了
#2 hades@2009-07-08 02:44:00
回复 删除
最好别递归……

此题可以证明,只需保证有一张牌回到初始位置,整个序列就是初始的位置,因此只需求出第N张牌经过多少次就行了,至于N的值,依个人口味酌情选择。

var

n,pos:longint;

m:longint;

begin

readln(n);

m:=1;

pos:=2;

while pos<>1 do begin

if pos<=n then pos:=pos*2 else pos:=(pos-n)*2-1;

m:=m+1;

end;

writeln(m);

end.

这是我的程序。

#3 caiweiwenjs@2009-07-12 04:22:00
回复 删除
我问的是,为什么递归会出错了,不要竟回答一些没用的。
#4 Jollwish@2009-07-12 04:35:00
回复 删除
(1)后2个超出longint范围

(2)递推总是好些的,这么大的数据本来递归就容易栈溢出

#5 zsx@2009-11-11 02:20:00
回复 删除
递归是没问题啦~

但是数据大了点这肯定会栈溢出

#6 zsx@2009-11-11 02:23:00
回复 删除
测试结果9:标准输5位

测试结果10:标准输出7位!

这都不栈溢出才怪

查看更多回复
提交回复