相同逻辑的drawPyramid_recursive递归函数在C和Python中输出不同的原因
问题原因说明
你遇到的输出差异和C、Python的递归调用栈实现无关,二者的调用栈逻辑都是遵循后进先出的标准规则,差异完全来自两段代码的逻辑错误:
C代码问题
你贴出的C代码中return drawPyramid_recursive(height, level - 1);这行多写了return关键字,按照这段代码的逻辑,递归调用后直接返回,后面的所有打印代码永远不会被执行,正常运行不会有任何输出,你给出的C输出应该是手动删掉这行多余return之后的运行结果。
Python代码问题
你的Python代码和修正return后的C代码逻辑完全不一致,存在两个错误:
- 打印部分多加了一层
for level in range(1, height + 1)的循环:C版本递归返回后只会打印当前level对应的一层金字塔,而你这段Python代码每次递归返回后都会循环打印从1到height的所有层,也就是一整个完整金字塔。 - 额外循环的变量名直接用了
level,覆盖了函数传入的level参数,就算删掉外层多余循环也会出现逻辑错误。
Python输出异常的原因
当输入height=3时,初始调用level=3,会依次递归调用level=2、level=1,直到level=0触发基线条件返回:
- 首先回到
level=1的执行上下文,执行打印代码输出一整个3层金字塔 - 再回到
level=2的执行上下文,执行打印代码输出第二个完整3层金字塔 - 最后回到
level=3的执行上下文,执行打印代码输出第三个完整3层金字塔
刚好和你给出的Python输出完全吻合。
修正后的Python代码
删掉外层多余的循环,直接用传入的level参数打印当前层即可:
def drawPyramid_recursive(height, level): if level == 0: # base case return drawPyramid_recursive(height, level - 1) for column in range(height - level, 0, -1): print(" ", end="") for column in range(1, level + 1): print("#", end="") print(" ", end="") for column in range(1, level + 1): print("#", end="") print()
运行后输出和修正后的C代码完全一致。
内容的提问来源于stack exchange,提问作者haching
相关产品推荐
相关产品推荐

