递归函数产生堆栈溢出错误

时间:2019-04-04 04:39:23

标签: python python-3.x recursion stack-overflow

我正在尝试解决作业问题:


纳皮厄勒山(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

回声总数:3

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."))

3 个答案:

答案 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.738int(len(b)*a)0-00相同,因此您要使用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个字符(一个删除和一个插入)会更正您的代码