要求:称为角谷猜想:对于一个正整数n,若为偶数则除以2,若为奇数则乘以3加1,得到一个新的数后按照之前的两条规则继续演算,若干次后得到的结果必然为1。输入任一正整数,输出演算过程。然后计算其计算运行次数。

角谷猜想递归其实并不更加简洁,因此用来作为递归理解。

闭包的基本条件:

1 在一个外函数中定义了一个内函数。

2 内函数里运用了外函数的临时变量。

3 并且外函数的返回值是内函数的引用。

另外:外部函数的变量,相当于绑定在了内部函数中,就是有一部分内存会被一直占用来存储外部函数的变量。所以内部函数可以总是访问外部函数的变量和声名。

详细说明请看其他的文章

运用闭包的角谷猜想递归代码:

#角谷猜想
count,end = 0,0
def process(n):#整数输入
    if n == 1:#基例,结束条件
        return#有无返回值都可以,因为递归不参与计算,无值也不影响。
    def process2():
        global count,end#计数器
        if n%2 == 1:
            count += 1
            end = n*3 + 1
            print(end)#输出运行结果
            process(end)#调用外部函数
        elif n%2 == 0:
            end = n//2#输入要求整数,所有用整除
            count += 1
            print(end)#输出运行结果
            process(end)#调用外部函数
        return count
    return process2()
print("运行{}次".format(process(int(input("请输入数字")))))

递归是抽象了计算的过程,要深究每一步是比较复杂的,如果觉得还不能理解这个代码,可以先从阶乘的递归一些基础的递归进行理解。

运行结果:请输入数字:20

                10
                5
                16
                8
                4
                2
                1
                运行7次

可见程序符合角谷猜想,并进行了7次变换

不运用闭包的角谷猜想递归代码:

#角谷猜想
count,end = 0,0
def process(n):
    global count,end
    if n == 1:
        return 1#有无返回值都可以,因为递归不参与计算,无值也不影响。
    elif n%2 == 1:
        count += 1
        end = n*3 + 1
        print(end)#看最后数是否为1
        process(end)
    elif n%2 == 0:
        count += 1
        end = n//2#整除,因为要求输入整数,即进行整数的运算。
        print(end)#看最后数是否为1
        process(end)
    return count
print("运行{}次".format(process(int(input("请输入数字")))))

使用基础方法的代码:

n = int(input("请输入数字:"))
count = 0
while n != 1:
    if n % 2 == 0:
        count += 1
        end = n / 2
        print("%d" %(end))
        n = end
    else:
        count += 1
        end = n * 3 + 1
        print("%d" %(end))
        n = end
print(f"运行{count}次")

这就是角谷猜想的三种验证方法。

编译环境为vscode最新版

 

 

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐