python算法:角谷猜想
一,认识递归函数
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