我很难理解递归。我对递归有了基本的了解,它遵循堆栈的概念,但在下面的程序解释中遇到了问题
我阅读了使用递归反转字符串的代码。我看到的代码是
a = "nitesh"
def abc(a):
if len(a) == 0:
return a
return abc(a[1:]) + a[0]
print(abc(a))
输出为
hsetin
这就是我的理解
--->;if len(a)==0:return--->;这是递归必须满足的退出条件
--->;return abc[a[1:])--->;这就是递归出现的地方。在这里,它从第一个索引开始切片字符串。在每一次迭代中,它将采用下一个索引。当字符串长度变为0时,它返回“”(空字符串),然后开始返回。下一次迭代将有最后一个元素(h)。接下来的迭代是如何返回s
。我很困惑
下面的“->;”表示返回。你知道吗
<>最后返回空白字符,现在回溯考虑这个调用图,从顶部开始,每个函数调用都在下面一行。递归函数在开始时会调用自己,输入越来越小,但在到达基本情况之前,它不会返回任何值。你知道吗
abc(“尼特斯”)
abc(“itesh”)
abc(“tesh”)
abc(“tesh”)
abc(“tesh”)
abc(“tesh”)
abc(“esh”)
abc(“sh”)
abc(“h”)
abc(“”)
现在,当调用开始返回值时,它将开始“备份”调用,而不是递归调用。你知道吗
abc(“”)返回“
abc(“h”)接收“”并附加“h”,返回“h”
abc(“sh”)接收“h”并附加“s”,返回“hs”
abc(“esh”)收到“hs”并附加“e”,返回“hse”
... 你知道吗
一直工作到“hsetin”
当您在长度为非零的字符串上调用函数abc时,该函数不会返回数字,而只会将下一个函数调用放在堆栈顶部。请注意,
a
是函数的一个变量局部,因此它在每个函数调用中都有一个新的定义。 循序渐进: a=“nitesh”,所以len(a)>;0,函数返回 abc(a[1:])+a[0]=abc(“itesh”)+“n”。 为了对此进行评估,函数调用abc(“itesh”)被执行(现在是a=“itesh”)并返回abc(“tesh”)+“itesh”[0]=abc(“tesh”)+“i”,因此总体返回值现在是abc(“tesh”)+“i”+“n”。这种情况一直持续到最后对空字符串调用abc
,它返回一个空字符串,并且在递归函数调用过程中返回的所有字符串的串联与原始字符串相反。你知道吗相关问题 更多 >
编程相关推荐