def myLog(x,b):
def logCall(x,b,cnt):
if (int(x) < b):
return cnt
else:
cnt+= 1
logCall(int((int(x)/b)),b,cnt)
return logCall(x,b,0)
res=myLog(16,2)
print res
此函数应返回值4.但它返回None。当我打印cnt的值时,我看到正确的值。但是当我返回它时,我得到的值为无
答案 0 :(得分:6)
您没有返回递归调用:
else:
cnt += 1
logCall(int((int(x)/b)),b,cnt)
你的功能只是在那里结束而你返回None
,而不是明确的return
结束的函数的默认值。
返回递归结果:
else:
cnt += 1
return logCall(int((int(x)/b)),b,cnt)
递归调用不会神奇地使调用帧返回;对logCall()
的调用与任何其他函数调用一样,,您仍然需要处理返回的值。
通过该更改,您的代码将返回预期值:
>>> def myLog(x,b):
... def logCall(x,b,cnt):
... if (int(x) < b):
... return cnt
... else:
... cnt+= 1
... return logCall(int((int(x)/b)),b,cnt)
... return logCall(x,b,0)
...
>>> myLog(16,2)
4
无需在整个地方使用int()
;你的输入已经是整数。如果您只想进行整数除法,请使用//
地板除法运算符。
您可能希望添加一些空白以便于阅读,else
是可选的,因为如果if
测试为真,您已经退出该函数。 →
最后但同样重要的是,您可以为cnt
提供默认值,无需嵌套您的函数:
def myLog(x, b, cnt=0):
if x < b:
return cnt
return myLog(x // b, b, cnt + 1)
答案 1 :(得分:0)
变体,Python 3闭包;
def myLog(x,b):
def logCall(cnt=0):
nonlocal x
if x < b:
return cnt
x /= b
return logCall(cnt+1)
return logCall
res=myLog(16,2)
res()
用于Python 2闭包,传递列表;
def myLog(l):
def logCall(cnt=0):
if l[0] < l[1]:
return cnt
l[0] /= l[1]
return logCall(cnt+1)
return logCall
res=myLog(16,2)
res()