[英]Recursive Function Produces Stack-Overflow Error
我正在尝试解决作业问题:
纳皮厄勒山脉的第一批探险家在闲暇时通过喊叫不同的短语来娱乐自己,听回声的响声。 在游戏中,他们注意到第一个回声总是原始短语的一小部分,第二个回声则是第一个回声的相同部分,依此类推,直到所有内容都保持沉默为止。 例如,在纳皮厄勒地区,分数约为0.368。
当喊一个长100秒的短语时,第一个回声长100 * 0.368秒。 第二个是100 * 0.368 * 0.368,依此类推,直到无法察觉。 写一个程序,以文本形式近似Napieuler山的回声。 程序必须通过控制台接收它想要近似的回声的特征分数(作为一个十进制数)。 然后程序必须需要调用一个递归函数,您应该收到一个短语。 最后,您应该打印出该短语的所有回声,包括人类呼喊的原始短语。 您还必须显示重复的总数,包括原始短语。 由于您不容易计算出一个书面短语的持续时间,因此可以假定每个字母花费的时间都是固定的,包括空格和标点符号。 四舍五入具有非整数结果的乘法。 如果您正确执行程序而未调用递归函数,则问题将为0。
您的功能需要
Enter the fraction: 0.369
Enter the sentence: I love mac and cheese
I love mac and cheese
cheese
se
Enter the fraction: 0.369
Enter the sentence: Today it is not a beautiful spring day. I wish ot was.
Today it is not a beautiful spring day. I wish ot was.
day. I wish it was.
it was.
s.
Total of echoes: 4
我已经开始编写代码,但是不断出现堆栈溢出错误。 任何帮助,将不胜感激。
不断产生堆栈溢出错误的代码:
def echo(a,b):
if len(b)>=2:
return [b]+echo(a,b[(-(int(len(b)*a))):])
else:
return []
print(echo(0.369,"I love mac and cheese."))
您可以使用几行简单的代码自行调试。 如果您通过添加一个计数器将其限制为10次递归来人为地限制代码从堆栈溢出,并添加一条print语句以查看每次递归调用中程序的状态,则可以轻松地找出代码的作用并进行比较达到您的预期效果:
def echo(a,b, counter=0):
if counter < 10 and len(b)>=2:
print('counter is: ', counter, ', I am using index: ', (-(int(len(b)*a))), ' which gives: ', b[(-(int(len(b)*a))):])
return [b]+echo(a,b[(-(int(len(b)*a))):], counter+1)
else:
return []
在此上调用print(echo(0.369,"I love mac and cheese."))
给我们:
counter is: 0 , I am using index: -8 which gives: cheese.
counter is: 1 , I am using index: -2 which gives: e.
counter is: 2 , I am using index: 0 which gives: e.
counter is: 3 , I am using index: 0 which gives: e.
counter is: 4 , I am using index: 0 which gives: e.
counter is: 5 , I am using index: 0 which gives: e.
counter is: 6 , I am using index: 0 which gives: e.
counter is: 7 , I am using index: 0 which gives: e.
counter is: 8 , I am using index: 0 which gives: e.
counter is: 9 , I am using index: 0 which gives: e.
['I love mac and cheese.', ' cheese.', 'e.', 'e.', 'e.', 'e.', 'e.', 'e.', 'e.', 'e.']
这就意味着,正如Joran所说的,您最终将无限地计算这部分:
'e.'[0:]
总是评估为'e.'
。
有了这些知识,我相信您将能够弄清楚该如何解决您的代码。
当len(b) == 2
len(b) * a == 0.738
,并且int(len(b)*a)
为0
。 -0
是一样的0
,那么你正在做与递归调用b[0:]
,这是一样的b
,让你无限递归。
当int(a * len(b)) == 0
时,您需要停止递归。
def echo(a,b):
newlen = int(len(b)*a)
if newlen > 0:
return [b]+echo(a,b[-newlen:])
else:
return [b]
print(echo(0.369,"I love mac and cheese"))
在最后一次迭代中,您有e.
len 2
你做echo(a,b[-0:])
实际上评估为echo(a,b[0:])
用e.
再次调用它e.
您需要更改2个字符(一次删除一次插入)即可更正您的代码
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.