python进阶,在第一期的基础上做了极大的优化,整体更加美观易懂

十五、递归函数

15.1、回顾返回值

回顾返回值:写法和返回值位置->返回位置是函数调用的地方

def a():  # 定义函数a
    return 520  # 返回值520 
print(a())
# 结果:
>>> 520

函数如果没有递归出口,直到超过最大递归深度,然后报错

15.2、递归函数

递归函数: 递归思想加函数配合
应用场景:

> a、在我们日常开发中,如果要遍历一个文件夹下面所有的文件,通常会使用递归来实现
> b、在后续的算法课程中,很多算法都离不开递归。 例如:快速排序等

小需求,使用递归函数去实现3以内的数字累加和:1+2+3+4+5=15

15 = 5+4+3+2+1 15=5+4以内的数字的累加和
4以内的数字累加和 = 3+2以内的数字累加和
2以内的数字累加和 =2+1以内的数字累加和
1以内的数字累加和 = 1 # 出口

函数调用特点:
	1、函数内部自己调用自己  
	2、必须要有出口
# 函数的作用:计算整型变量x以内的数字累加和
def sum_numbers(num):
    # 2、写出口:如果是1,那么返回1
    if num == 1:  # 判断条件,条件成立才能结束调用 
        return 1
    # 1、当前数字 + (当前数字 - 1)的累加和
    return num + sum_numbers(num - 1)  # 在函数里面调用该函数
print(sum_numbers(5))
# 结果:15
递归特点:
>	 a、函数内部自己调用自己
>	 b、必须有出口

15.3、引用

引用的作用:在python中,值是靠引用传递来的
可变和不可变类型:数据能够直接修改,如果能直接修改那麽就是可变类型,否则是不可变类型

a、不可变数据: int id():检测变量的id值(内存地址)

a = 99
b = a
print(a)
print(b)
print(id(a))
print(id(b))
# 结果:
# 99
# 99
# 140727359932544  # a和b的结果虽然都是一样的但是内存地址不一样
# 140727359932544


# 修改a的数据测试id值
a = 888
print(a)
print(b)
print(id(a))
print(id(b))
# # 结果:
# 888
# 99
# 2213030708208  # a的值被修改,a的地址改变
# 140727359932544  # b的地址位置依然不变

b、可变数据类型:列表

aa = [60, 80]
bb = aa
print(id(aa))
print(id(bb))
# 结果:
# 2354272424456  # 地址一致
# 2354272424456


# 修改列表中的值
aa.append(30)
print(aa)
print(bb)
print(id(aa))
print(id(bb))
# 结果:
# [60, 80, 30]
# [60, 80, 30]
# 2354272424456
# 2354272424456