无法验证此递归程序的输出
unable to validate output of this recursive program
我们有这个递归 python 程序:
def tri_recursion(k):
if(k > 0):
result = k + tri_recursion(k - 1)
print(result)
else:
result = 0
return result
print("\n\nRecursion Example Results")
tri_recursion(6)
根据我的理解,这个程序的输出应该是:
1,3,5,7,9,11
但实际输出是:
1,3,6,10,15,21
有人可以解释一下背后的原因吗?
这是我的理解程序将启动为
k as 6, then 6 > 0 then system will call tri_recusrion(6-1)
now k is 5, then 5 > 0 then system will call tri_recusrion(5-1)
now k is 4, then 4 > 0 then system will call tri_recusrion(4-1)
now k is 5, then 3 > 0 then system will call tri_recusrion(3-1)
now k is 2, then 2 > 0 then system will call tri_recusrion(2-1)
now k is 1, then 1 > 0 then system will call tri_recusrion(1-1)
now k is 0, then 0 !> 0 condition will break
now function will start to return in reverse order:
tri_recusrion(1-1) in this case k is 1; k + (1-1) prints 1
tri_recusrion(2-1) in this case k is 2; k + (2-1) prints 3
tri_recusrion(3-1) in this case k is 3; k + (3-1) prints 5
tri_recusrion(4-1) in this case k is 4; k + (4-1) prints 7
tri_recusrion(5-1) in this case k is 5; k + (5-1) prints 9
tri_recusrion(6-1) in this case k is 6; k + (6-1) prints 11
函数每次自己调用时,都会将k
的当前值加到result
上。您正在打印的当前列表是 1, 1+2, 1+2+3, 1+2+3+4, ...
,也是 1, 3, 6, 10, ...
。要修复错误,请分别写 result = 1
和 result = 2 + tri_recursion(k - 1)
而不是 result = 0
和 result = k + ...
。
先解释一下这个函数的作用:
k
是函数的参数,基本条件是当k
为0时,结果为0且什么都不打印,函数只是returns 0
如果 k
大于 0,程序计算 tri_recursion(k-1
),将其添加到 k
并打印,然后 returns它
如果我们用参数 k=6
调用函数,它会用 k=5
调用同一个函数,然后它用 k=4
做同样的事情...最后用k=0
程序将停止调用自身。在那之后,计算结果将被传送到调用前一级以完成该调用。
因此,程序到达k=0
后立即执行的步骤如下。
由于 k=0
returns 0
,k=1
的结果变为 k + 0
=> 1 + 0
,打印 1
和returns它
由于 k=1
returns 1
,k=2
的结果变为 k + 1
=> 2 + 1
,打印 3
和returns它
由于 k=2
returns 3
,k=3
的结果变为 k + 3
=> 3 + 3
,打印 6
和returns它
由于 k=3
returns 6
,k=4
的结果变为 k + 6
=> 4 + 6
,打印 10
和returns它
因为 k=4
returns 10
,k=5
的结果变成 k + 10
=> 5 + 10
,打印 15
和returns它
由于 k=5
returns 15
,k=6
的结果变为 k + 15
=> 6 + 15
,打印 21
和returns它
下面是代码中每个递归调用中带有 args 和 return 值的调用图的可视化。
您可以点击这个优秀的 in-browser python recursion visualizer.
的逐步进展
我们有这个递归 python 程序:
def tri_recursion(k):
if(k > 0):
result = k + tri_recursion(k - 1)
print(result)
else:
result = 0
return result
print("\n\nRecursion Example Results")
tri_recursion(6)
根据我的理解,这个程序的输出应该是:
1,3,5,7,9,11
但实际输出是:
1,3,6,10,15,21
有人可以解释一下背后的原因吗? 这是我的理解程序将启动为
k as 6, then 6 > 0 then system will call tri_recusrion(6-1)
now k is 5, then 5 > 0 then system will call tri_recusrion(5-1)
now k is 4, then 4 > 0 then system will call tri_recusrion(4-1)
now k is 5, then 3 > 0 then system will call tri_recusrion(3-1)
now k is 2, then 2 > 0 then system will call tri_recusrion(2-1)
now k is 1, then 1 > 0 then system will call tri_recusrion(1-1)
now k is 0, then 0 !> 0 condition will break
now function will start to return in reverse order:
tri_recusrion(1-1) in this case k is 1; k + (1-1) prints 1
tri_recusrion(2-1) in this case k is 2; k + (2-1) prints 3
tri_recusrion(3-1) in this case k is 3; k + (3-1) prints 5
tri_recusrion(4-1) in this case k is 4; k + (4-1) prints 7
tri_recusrion(5-1) in this case k is 5; k + (5-1) prints 9
tri_recusrion(6-1) in this case k is 6; k + (6-1) prints 11
函数每次自己调用时,都会将k
的当前值加到result
上。您正在打印的当前列表是 1, 1+2, 1+2+3, 1+2+3+4, ...
,也是 1, 3, 6, 10, ...
。要修复错误,请分别写 result = 1
和 result = 2 + tri_recursion(k - 1)
而不是 result = 0
和 result = k + ...
。
先解释一下这个函数的作用:
k
是函数的参数,基本条件是当k
为0时,结果为0且什么都不打印,函数只是returns 0
如果 k
大于 0,程序计算 tri_recursion(k-1
),将其添加到 k
并打印,然后 returns它
如果我们用参数 k=6
调用函数,它会用 k=5
调用同一个函数,然后它用 k=4
做同样的事情...最后用k=0
程序将停止调用自身。在那之后,计算结果将被传送到调用前一级以完成该调用。
因此,程序到达k=0
后立即执行的步骤如下。
由于 k=0
returns 0
,k=1
的结果变为 k + 0
=> 1 + 0
,打印 1
和returns它
由于 k=1
returns 1
,k=2
的结果变为 k + 1
=> 2 + 1
,打印 3
和returns它
由于 k=2
returns 3
,k=3
的结果变为 k + 3
=> 3 + 3
,打印 6
和returns它
由于 k=3
returns 6
,k=4
的结果变为 k + 6
=> 4 + 6
,打印 10
和returns它
因为 k=4
returns 10
,k=5
的结果变成 k + 10
=> 5 + 10
,打印 15
和returns它
由于 k=5
returns 15
,k=6
的结果变为 k + 15
=> 6 + 15
,打印 21
和returns它
下面是代码中每个递归调用中带有 args 和 return 值的调用图的可视化。
您可以点击这个优秀的 in-browser python recursion visualizer.
的逐步进展