python算法:角谷猜想

news/2024/9/21 8:06:15

一,认识递归函数

1,什么是递归?
递归的工作原理是,如果函数需要处理的问题大小合适,则直接求解并返回结果,
否则将问题分解成两个或多个更小的子问题,并对子问题进行相同的处理,
直到问题无法分解为止

2,什么是递归函数:
递归函数(recursive function)是指在函数体中可以调用自己的函数

3,语法

def fn():# ...if condition:# 停止自我调用else:fn()# ...

4,递归函数的优点和缺点

递归函数的优点:它们可以帮助程序员在处理复杂问题时提供一种简单且易懂的解决方案。
递归函数使代码具有可读性和可重用性,
而且可以使用递归函数解决使用其他方法难以处理的问题。
递归函数的缺点: 递归函数可能会在运行时占用较多的系统资源,
因为它们需要在堆栈上存储多个函数调用
其次,递归函数可能导致代码变得不容易理解,
因为它具有一定的复杂度

二,角谷猜想(又名冰雹猜想)

1,角谷猜想的问题:

输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1
经过如此有限次运算后,总可以得到自然数值1
求经过多少次可得到自然数1?

2,解析:

数字为1时结束循环,
否则一直重复进行除2或乘3加1的运算,
这是很典型的递归函数的特点

三,代码实现

1,使用递归函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
times = 0
# 递归函数
# num: 要进行计算的数字
def hail(num):
    global times
    if num == 1:     # 得到1时结束
        return
    else:
        orig = int(num)
        if num % 2 == 0:
            times += 1
            num /= 2
            print(f'{orig}/2={int(num)}')
        else:
            times += 1
            num = num * 3 + 1
            print(f'{orig}x3+1={int(num)}')
        hail(num)
 
# digit: 输入的自然数
digit = int(input('请输入一个自然数:'))
hail(digit)
print("次数",times)

运行结果:

请输入一个自然数:22
22/2=11
11x3+1=34
34/2=17
17x3+1=52
52/2=26
26/2=13
13x3+1=40
40/2=20
20/2=10
10/2=5
5x3+1=16
16/2=8
8/2=4
4/2=2
2/2=1
次数 15

说明:刘宏缔的架构森林—专注it技术的博客,
网址:https://imgtouch.com
本文: https://blog.imgtouch.com/index.php/2024/03/11/python-suan-fa-jiao-gu-cai-xiang/
代码: https://github.com/liuhongdi/ 或 https://gitee.com/liuhongdi
说明:作者:刘宏缔 邮箱: 371125307@qq.com

2,使用while循环

1
2
3
4
5
6
7
8
9
10
11
12
s = int(input('请输入一个自然数:'))    # 要转换为1的数字
times = 0     # 运算的次数
while (s != 1):
    orig = s     # 保存下未运算前的原始数字,打印用
    if s % 2 == 0:     # 偶数时
        s = int(s / 2)
        print(f'{orig}/2={s}')
    elif s % 2 != 0:     # 奇数时
        s = int(s * 3 + 1)
        print(f'{orig}x3+1={s}')
    times = times + 1
print(f'经过{times}次运算得到自然数1')

运行结果:

请输入一个自然数:22
22/2=11
11x3+1=34
34/2=17
17x3+1=52
52/2=26
26/2=13
13x3+1=40
40/2=20
20/2=10
10/2=5
5x3+1=16
16/2=8
8/2=4
4/2=2
2/2=1
经过15次运算得到自然数1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/31726.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

python算法:水仙花数

一,for循环: 1,功能:重复执行同一段代码语法: for index in range(n): # 循环体代码 index : 用来依次接收可迭代对象中的元素的变量名range()函数:负责返回整数序列 流程图:2,应用 range可以同时指定start 和stop,用for遍历并打印1 2 3 4# 指定 start和stop # print的参数 e…

python算法:n皇后

一,认识递归函数 1,什么是递归?递归的工作原理是,如果函数需要处理的问题大小合适,则直接求解并返回结果,否则将问题分解成两个或多个更小的子问题,并对子问题进行相同的处理,直到问题无法分解为止 2,什么是递归函数:递归函数(recursive function)是指在函数体中可以…

python: 递归函数:汉诺塔

一,认识递归函数 1,什么是递归?递归的工作原理是,如果函数需要处理的问题大小合适,则直接求解并返回结果,否则将问题分解成两个或多个更小的子问题,并对子问题进行相同的处理,直到问题无法分解为止 2,什么是递归函数:递归函数(recursive function)是指在函数体中可以…

CPLEX 初识 -- JAVA实现

CPLEX 初识 -- JAVA实现 本文参考《运筹优化常用模型、算法及案例实战》,同时也是笔者用来记录自己所学知识,如有问题欢迎交流讨论~ 1 环境配置&模型建立 需要装配jar包及配置VM options, 如下图所示:-Djava.library.path="/Applications/CPLEX_Studio2211/java&qu…

VMware产品最新下载地址

好像被博通收购后好多被搜索引擎收录的地址都失效了 可以到博通网站的这个页面去下载,好像需要注册登录,国内QQ邮箱也能注册成功 https://support.broadcom.com/group/ecx/downloads

WPF使用Shape实现复杂线条动画

看到巧用 CSS/SVG 实现复杂线条光效动画的文章,便也想尝试用WPF的Shape配合动画实现同样的效果。ChokCoco大佬的文章中介绍了基于SVG的线条动画效果和通过角向渐变配合 MASK 实现渐变线条两种方式。WPF中的Shape与SVG非常相似,因此这种方式也很容易实现。但WPF中仅有的两种渐…

maven打包失败

问题: 用maven命令打包java应用jar包时打包失败,显示错误“找不到符号”,但是具体的代码中没有找到错误 解决方法: 如果打包的应用为子应用,需要到父应用中打包

EBS 可保留量(Quantity Available To Reserve) 异常 -- 子库间的转移

1、出现可保留量数量为0或者不不相等的情况 2、查看子库状态的生效状态 3、从新跑请求:保留接口管理器4、最后可用量就出来了本文来自博客园,作者:Iven_lin,转载请注明原文链接:https://www.cnblogs.com/ivenlin/p/18192660