gpt4 book ai didi

python - 在变量内部完成递归

转载 作者:太空宇宙 更新时间:2023-11-03 14:58:43 25 4
gpt4 key购买 nike

如果它在变量中,我对编译器如何进行递归感到有点困惑。轻松解释问题的唯一方法是举个例子。

def recur_var(s1, s2):
'''Test for recursion in variables.'''
if s1 == '':
return s2
elif s2 == '':
return s1
else:
test = recur_var(s1[:-1], s2[:-1])
if s1[-1] == '1' and s2[-1] == '1':
return True
return test

在上面的代码中唯一完成的递归是在优先级高于其他一切的变量内部,除了基本情况。

我意识到这段代码的作用无处不在,但我的问题是,在这个堆栈的踪迹中,测试是否只成为切片的剩余部分?

test 是否一直递归到基本情况,而不检查 s1[-1]s2[-1] 都是 1?换句话说,它是在调用时 100% 忽略其下方的所有内容,还是忽略自身并按照其余代码进行调用?

我意识到这可能被问到并且措辞糟糕,但我自己很困惑,所以我不知道更好的方法。

最佳答案

简短回答

是的,该函数在检查结束字符之前在缩短的字符串上重复出现。它仅在用尽其中一个字符串后才进行检查——因为它返回调用堆栈。


注意事项

  1. 编译器生成机器码;运行时系统或 Python 解释实际上递归
  2. 变量中没有递归之类的东西。变量是数据;递归是一个控制流的概念。我不太确定您所说的用法是什么意思。

此外,您还没有描述您的例程应该做什么。它实际上做的是找出字符“1”是否出现在距两个给定字符串末尾相同的距离处。如果是,则返回 True;否则,它返回较长字符串的第一个 (abs(len(s1) - len(s2)) 个字符。这是非常奇怪的行为,返回两种不同的数据类型。


跟踪您的执行

了解一些 debugging techniques .当您继续编程时,它们会很好地为您服务。

为了处理您的程序,我做了两件事:

  1. 我将其转换为结构化编程:例程的一个导出。我将所需的结果放入一个变量中,并且只在例程的底部返回。这使我能够在单个导出点跟踪执行情况。

这看起来像:

def recur_var(s1, s2):
global depth
'''Test for recursion in variables.'''
if s1 == '':
result = s2
elif s2 == '':
result = s1
else:
test = recur_var(s1[:-1], s2[:-1])
if s1[-1] == '1' and s2[-1] == '1':
result = True
else:
result = test

return result
  1. 接下来,我插入了调试跟踪:输入和返回后的打印语句,以及使事情更容易可视化的缩进计数器。

这看起来像:

depth = 0
def recur_var(s1, s2):
global depth
depth += 1
print " "* depth, "ENTER", "s1 =", s1, "s2 =", s2
'''Test for recursion in variables.'''
if s1 == '':
print " "* depth, "s1 is empty; return s2"
result = s2
elif s2 == '':
print " "* depth, "s2 is empty; return s1"
result = s1
else:
test = recur_var(s1[:-1], s2[:-1])
print " "* depth, "both strings have chars; test=", test
if s1[-1] == '1' and s2[-1] == '1':
result = True
else:
result = test

print " "* depth, "LEAVE", "result =", result
depth -= 1
return result

print recur_var("8610", "17")
print recur_var("X8610", "X17")
print recur_var("hello", "world !")

... 这些测试的输出是...

   ENTER s1 = 8610 s2 = 17
ENTER s1 = 861 s2 = 1
ENTER s1 = 86 s2 =
LEAVE result = 86
LEAVE result = True
LEAVE result = True
True
ENTER s1 = X8610 s2 = X17
ENTER s1 = X861 s2 = X1
ENTER s1 = X86 s2 = X
ENTER s1 = X8 s2 =
LEAVE result = X8
LEAVE result = X8
LEAVE result = True
LEAVE result = True
True
ENTER s1 = hello s2 = world !
ENTER s1 = hell s2 = world
ENTER s1 = hel s2 = world
ENTER s1 = he s2 = worl
ENTER s1 = h s2 = wor
ENTER s1 = s2 = wo
LEAVE result = wo
LEAVE result = wo
LEAVE result = wo
LEAVE result = wo
LEAVE result = wo
LEAVE result = wo
wo

这应该能让您弄清楚您需要知道的一切。

关于python - 在变量内部完成递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40269260/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com