我正在尝试解决作业问题:
纳皮厄勒山(Napieuler Mountains)的第一批探险者在闲暇时通过 喊出不同的短语,听听回声的声音。在游戏中,他们注意到 第一个回声始终是原始短语的一部分,第二个回声则是原始短语的相同部分 第一次回声,依此类推,直到一切都变得寂静。 例如,在纳皮厄勒地区,分数约为0.368。
当喊出100秒长的短语时,第一次回声为100 * 0.368秒长。 第二个是100 * 0.368 * 0.368,依此类推,直到无法察觉。 写一个程序,以文本形式近似Napieuler山的回声。 程序必须通过控制台接收想要回波的特征部分 近似值(作为一个十进制数字)。 然后程序必须需要调用一个递归函数,您应该收到一个短语。 最后,您应该打印出该短语的所有回声,包括喊出的原始短语 由人。您还必须显示重复的总数,包括原始短语。 由于您无法轻松计算出书面短语的持续时间,因此可以假设 字母需要固定的时间,包括空格和标点符号。舍入乘法 非整数结果。 如果您正确执行程序而未调用递归函数,则在 问题。
您的功能需要
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."))
答案 0 :(得分:1)
您可以使用几行简单的代码自行调试。如果您通过添加一个计数器将其限制为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.'
。
有了这些知识,我相信您将能够弄清楚该如何解决您的代码。
答案 1 :(得分:1)
当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"))
答案 2 :(得分:0)
在您的上一次迭代中,您有e.
是len 2
您做echo(a,b[-0:])
其实际值为echo(a,b[0:])
使用e.
您需要更改的2个字符(一个删除和一个插入)会更正您的代码