递归函数产生堆栈溢出

2024-06-16 09:53:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试解决一个家庭作业问题:


纳庇勒山脉的第一批探险家,在闲暇时间,以 喊着不同的短语,听回声的声音。在他们的游戏中,他们注意到 第一个回声总是原始短语的一小部分,第二个回声是原始短语的一小部分 第一次回音,一直到一切都静了下来。 例如,在Napieuler地区,分数约为0.368

当喊一个100秒长的短语时,第一个回声是100*0.368秒长。 第二个是100*0.368*0.368,以此类推,直到看不见为止。 写一个程序,在文本中,近似于纳皮尔勒山脉的回声。 程序必须通过控制台接收它想要接收的回声的特征部分 近似值(作为一个十进制数)。 然后程序必须调用一个递归函数,您应该收到一个短语。 最后,您应该打印出短语的所有回声,包括原始短语 一个人类。你还必须显示总的重复,包括原来的短语。 由于你不容易计算出一个书面短语的时长,你可以假设 字母需要固定的时间,包括空格和标点符号。将乘法取整为 非整数结果。 如果您在不调用递归函数的情况下正确地执行程序,则在 问题

你的职能需要

示例:

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

Tags: andtheecho程序mac时间itsentence
3条回答

您可以使用几行简单的代码自行调试。如果您通过添加一个计数器将代码限制为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.']

这意味着,正如乔兰所说,你最终会无限地计算这一部分:

'e.'[0:]

它的计算结果总是'e.'

有了这些知识,我相信您一定能够想出如何修复代码

在上一次迭代中,您有e.

哪个是len 2

你可以echo(a,b[-0:])

实际计算结果是echo(a,b[0:])

e.再次调用

您需要更改两个字符(一个删除一个插入),以更正代码

len(b) == 2时,则len(b) * a == 0.738,且int(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"))

相关问题 更多 >