【问题标题】:Recursive Collatz-Conjecture output challenge递归 Collat​​z-Conjecture 输出挑战
【发布时间】:2019-03-27 06:08:55
【问题描述】:

我有一个用于计算 collat​​z 猜想的递归函数。该代码产生正确的数字,它基于计数器递归调用自身。一旦计数器用完,它应该返回正确的数字 - 但它返回None

def collatz_con(x, revs):
    print("start")
    print(x, revs)
    if (x%2 == 0) and (revs != 0):
        print("even and revs =" + str(revs))
        holder = x//2
        print(holder)
        collatz_con(holder, revs - 1)
    elif (revs != 0):
        print("odd  and revs =" + str(revs))
        holder = ((3*x) + 1)
        print(holder)
        collatz_con(holder, revs -1)
    else:
        print("else exercised")
        return x   
print(collatz_con(1071, 14))

是否应该返回并打印出x 变量?

【问题讨论】:

    标签: python recursion


    【解决方案1】:

    您犯了一个常见错误,即递归函数collatz_con() 返回一个值,但是当您递归调用它时,您会忽略该返回值。我猜你想要的更像是:

    def collatz_con(x, revs):
        print(x, revs)
    
        if x % 2 == 0 and revs != 0:
            print("even and revs =", revs)
            holder = x // 2
            print(holder)
            return collatz_con(holder, revs - 1)
    
        if revs != 0:
            print("odd and revs =", revs)
            holder = 3 * x + 1
            print(holder)
            return collatz_con(holder, revs - 1)
    
        print("else exercised")
        return x
    

    【讨论】:

    • 我想我明白了。我从函数内部调用 collat​​z 函数,您的方法返回一个递归调用。为了提供最终答案,执行 else 语句并将最终值返回给原始函数调用。谢谢。