python函数没有返回正确的值 def myLog(x,b): def日志调用(x、b、cnt): 如果(int(x)

python函数没有返回正确的值 def myLog(x,b): def日志调用(x、b、cnt): 如果(int(x),python,function,return,Python,Function,Return,此函数应返回值4。但它不会返回任何结果。当我打印cnt的值时,我看到了正确的值。但是当我返回它时,得到的值为None您没有返回递归调用: 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

此函数应返回值4。但它不会返回任何结果。当我打印cnt的值时,我看到了正确的值。但是当我返回它时,得到的值为None

您没有返回递归调用:

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
相反,您的函数只在此处结束,并返回
None
,这是函数在没有显式
return
的情况下结束时的默认值

返回递归结果:

else:
    cnt += 1
    logCall(int((int(x)/b)),b,cnt)
递归调用不会神奇地使调用帧返回;对
logCall()
的调用与任何其他函数调用一样,仍然需要处理返回的值

更改后,代码将返回预期值:

else:
    cnt += 1
    return logCall(int((int(x)/b)),b,cnt)

一个变体,Python3闭包

def myLog(x, b, cnt=0):
    if x < b:
        return cnt
    return myLog(x // b, b, cnt + 1)
def myLog(x,b):
def日志调用(cnt=0):
非局部x
如果x
对于Python2闭包,传递列表

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()  
def myLog(l):
def日志调用(cnt=0):
如果l[0]
这种尾部递归函数只是要求将其转换为迭代解!明亮的非常感谢您的帮助为什么这里需要进行类型转换
if(int(x)
因为我们只传递整数值?@AvinashRaj:我没有查看实际的代码本身。说得好。
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()  
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()