版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
※函数与递归函数
#如何判断回文素数
x = 151
is_palin = False
is_prime = False
if str(x)[::-1] == str(x):
is_palin = True
else:
print(False)
for i in range(2,x):
if x % i == 0:
break;
else:
is_prime = True
if is_palin and is_prime:
print("OK")
else:
print("NO")
该程序虽然可以实现回文素数的判断,但看起来很不直观,解决办法就是构造函数。
调用函数:is_palin( ),is_prime( ),程序为:
num = 11
def is_palin(num):
if str(num)[::-1] == str(num):
return True
else:
return False
def is_prime(num):
for i in range(2,num):
if num % i == 0:
break;
else:
return True
if is_palin(num) and is_prime(num):
print("YES")
else:
print("NO")
函数:完成特定功能的一个语句组,这组语句可以作为一个单位使用,并且给它取了一个名字。通过函数名执行
◎定义函数:
关键字 函数 参数
def print_sum(start,stop): //函数头
“”” //三引号
to calculate the sum from start to stop //说明文档
””””
result = 0 //函数体语句
for i in range(start,stop + 1):
result += i
print(“Sum is”,result)
#return result 函数调用完成后,返回数据,return语句终止当前函数的执行,其后语句将被忽略
◎调用函数:print_sum(1,10)
◎函数-变量作用域
x = 1
def f():
print(x)
y = 2
print(y)
f()
print(x)
print(y)
结果为:1
2
1
Traceback (most recent call last):
File "D:/苏嵌环境/Python自学/变量作用域.py", line 8, in <module>
print(y)
NameError: name 'y' is not defined
局部变量:只能在程序的特定部分使用的变量
全局变量:为整个程序使用的变量
x = 1
def f1():
x = 2
print(x)
f1()
print(x)
结果为 2
1
改变后:
x = 1
def increase():
global x //将变量转化为全局变量
x += 1
print(x)
increase()
print(x)
结果为 2
2
※函数的优点:
1、代码可重复使用:提高开发效率,减少重复编码
2、代码更简洁:函数功能相对独立,功能单一,结构清晰,可读性好
3、编程更容易把握:复杂程序分解成较小部件
4、封装与信息隐藏
◎打印给定年给定月份的日历
def is_leap_year(year):
if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:
return True
else:
return False
def get_num_of_days_in_month(year,month):
if month in(1,3,5,7,8,10,12):
return 31
elif month in(4,6,9,11):
return 30
elif is_leap_year(year):
return 29
else:
return 28
def get_total_num_of_day(year,month):
days = 0
for y in range(1800,year):
if is_leap_year(y):
days += 366
else:
days += 365
for m in range(1,month):
days += get_num_of_days_in_month(year,m)
return days
def get_start_day(year,month):
return (3 + get_total_num_of_day(year,month)) % 7
print(get_start_day(2033,12))
※递归函数
递归:程序调用自身
形式:在函数定义有直接或间接的调用自身
◎阶乘
#递归方式实现
def p(n):
if n == 1 or n == 0:
return 1
else:
return n * p(n - 1)
print(p(3))
递归解决问题的思想
if:问题足够简单:直接解决问题,返回解。
else:将问题分解为与原问题同构的一个或多个更多的问题,逐个解决这些更小的问题,将结果组合,获得最终的解,返回解。
◎兔子数列(斐波那契数列):1,1,2,3,5,8,13,21,34,55
def fib(n):
if n == 1 or n == 2:
return 1
return fib(n - 1) + fib(n - 2)
print(fib(8))
◎汉诺塔:将前n-1个盘子,通过C,从A移动到B,从A到C移动第n个盘子,将前n-1个盘子,通过A,从B移动到C
定义函数hanoi(n,A,B,B)表示把A上的n个盘子移动到C上,其中可以用到B
count = 0
def hanoi(n,A,B,C):
global count
if n == 1:
print("Move disk",n,"from",A,"to",C)
count += 1
else:
hanoi(n - 1,A,C,B)
print("Move disk",n,"from",A,"to",C)
count += 1
hanoi(n - 1,B,A,C)
hanoi(3,'Left','Mid','Right')
print("count = ",count)
结果为:
Move disk 1 from Left to Right
Move disk 2 from Left to Mid
Move disk 1 from Right to Mid
Move disk 3 from Left to Right
Move disk 1 from Mid to Left
Move disk 2 from Mid to Right
Move disk 1 from Left to Right
count = 7
◎路边停车
import random #引入随机函数
def parking(low,high):
if high - low < 1:
return 0
else:
x = random.uniform(low,high - 1) #随机停入一个位置
return parking(low,x) + 1 + parking(x + 1,high)
s = 0
for i in range(10000): #平均10000次后可以停的车的辆数
s += parking(0,5)
print(s / 10000)
◎递归的优劣分析:
优点:可以使一个蕴含递归关系且结构复杂的程序简洁精炼,特别在难于找到从边界到解的全过程的情况下,如果把问题推进一步,其结果仍维持原问题的关系
缺点:嵌套层次深,函数调用开销大,重复计算,时间效率低
◎小程序测试题:
'''
def fib(n):
f1,f2 = 0,1
while f2 < n:
print(f2)
f1,f2 = f2,f1 + f2
fib(10) #1 1 2 3 5 8
'''
'''
def foo():
m = 1
def bar():
n = 2
return m + n
m = bar()
print(m)
foo() #m = 3
'''
def gcd(m,n):
r = m % n
if r == 0:
return n
else:
r = m % n
return gcd(n,r)
print(gcd(15,36)) # n = 3