无法找出如何在递归函数中递增变量

问题描述 投票:-1回答:3

我正在尝试为collat​​z猜想创建一个python脚本(如果数字是奇数,将其乘以3并加1,如果是偶数,则除以2)。我无法弄清楚如何成功地增加一个变量,该变量显示函数的迭代次数,并且我认为它与递归有关。这是到目前为止我得到的:

def collatz(n):
    list_terminate = [0, 1, 2, 4]
    if n in list_terminate:
        return n
    else:
        if n % 2 == 0:
            print(n)
            iterations += 1
            return collatz(n // 2)
        if n % 2 == 1:  
            iterations += 1
            print(n)
            return collatz((n * 3) + 1)
python recursion math increment collatz
3个回答
1
投票

该变量在函数调用之间不存在。如果要在函数之间传递多个值,则将其作为参数传递给函数并返回两者。

def collatz(n, iterations):
    list_terminate = [0, 1, 2, 4]
    if n in list_terminate:
        return (n, iterations)
    else:
        if n % 2 == 0:
            print(n)
            iterations += 1
            return collatz(n // 2, iterations)
        if n % 2 == 1:  
            iterations += 1
            print(n)
            return collatz((n * 3) + 1, iterations)

如果您不喜欢像collatz(n, 0)那样调用函数,则使用此函数作为包装函数。

def collatz_helper(n, iterations):
        list_terminate = [0, 1, 2, 4]
        if n in list_terminate:
            return (n, iterations)
        else:
            if n % 2 == 0:
                print(n)
                iterations += 1
                return collatz(n // 2, iterations)
            if n % 2 == 1:  
                iterations += 1
                print(n)
                return collatz((n * 3) + 1, iterations)

def collatz(n):
    return collatz_helper(n, 0)

1
投票

您的问题陈述有点混乱,但如果适合,您可以尝试以下代码。

def collatz(n):
    iterations = 0
    list_terminate = [0, 1, 2, 4]
    if n in list_terminate:
        return n
    elif n % 2 == 0:
        # print(n)
        iterations += 1
        return ("No. of iterations : ", iterations, n//2)
    elif n % 2 == 1:
        iterations += 1
        # print(n)
        return ("No. of iterations : ", iterations,(n * 3) + 1)

1
投票

有一些选择...

1)更改函数签名以包括迭代次数。这样,您可以将信息传递给“上链”

2)更改num迭代的范围,以使变量存在于函数外部。

3)在collat​​z中添加一个递归函数。

方法(1,3)

def collatz(n):

    def recursion(x, iterations):
        print(f"{iterations}: {x}")
        if x in [0,1,2,4]:
            return x, iterations

        if x % 2 == 0:
            return recursion(x//2, iterations + 1)
        else:
            return recursion((x*3) + 1, iterations + 1)

        return n

    n, steps = recursion(n, 0)

方法(2)

iterations = 0
def collatz(n):
    global iterations

    print(f"{iterations}: {n}")
    if n in [0,1,2,4]:
        return n, iterations

    iterations += 1
    if n % 2 == 0:
        return collatz(n//2)
    else:
       return collatz((n*3) + 1)
© www.soinside.com 2019 - 2024. All rights reserved.