我确信这一定是我的一个明显愚蠢的错误。但任何人都可以使用递归来解释这个分割代码有什么问题。我知道有很多的选择,但我需要知道什么是错这个在python中使用递归的分区
def division(a,b):
x = 0
if a < b:
return x
else:
x += 1
return division(a-b,b)
return x
当我做除法(10,2),它给我0作为输出
我确信这一定是我的一个明显愚蠢的错误。但任何人都可以使用递归来解释这个分割代码有什么问题。我知道有很多的选择,但我需要知道什么是错这个在python中使用递归的分区
def division(a,b):
x = 0
if a < b:
return x
else:
x += 1
return division(a-b,b)
return x
当我做除法(10,2),它给我0作为输出
这可能工作好一点你:
def division(a,b,x=0):
if a < b:
return x
else:
x += 1
return division(a-b,b,x)
return x
您的每一次函数通过新recusion跑,你将x设置为0 。这样,如果没有指定x,它默认为0,并且应该像我想要认为一样工作。
另外请注意,这不会为负数的工作,但你可能知道:)
逃生条件是if a < b
。这意味着为了终止这个函数,必须完成这个才能离开递归。但是,由于x
是在函数的顶部声明的,因此只在else
语句的主体内重新定义但从未返回,函数将始终以值x = 0
终止。
您应该设置x = 1 + division(a-b,b)
或return division(a-b,b) + 1
并在最后删除无法访问return
。
def div(a, b, x):
if a < b:
return x
else:
x +=1
return div(a - b, b, x)
print(div(130, 10, 0))
# 13
那么我应该声明x全局还是有其他选择? – Ram
将x回馈给自己 - 这需要以x作为0喂食,这虽然不起作用,但起作用:请参阅上面的编辑 – camoverride
你总是局部变量x
设置为0
。
这时如果股息比除数小你返回x
这当然是0
的。另一方面,当股息大于或等于给你增加x
通过1
除数和执行递归以减少的红利进行呼叫,这当然会导致第一个案例结束,并且您仍然返回一个x
,该值为0
。
注意:尽管如此,由于您的if
和else
分支都包含return
,因此无法访问您的最终return
。
所以请尽量考虑这个解决方案:
def division(a, b):
if a < b:
return 0
else:
return 1 + division(a-b, b)
随着全球您可以:
def division(a,b):
global x
if a < b: return x
else:
x += 1
return division(a-b,b)
x=0
print (division(10,2))
但你必须设置x
调用之前每次到零division
在这种情况下,x必须是全局的。 – pcu
您总是将x设置为0. – Szabolcs