递归函数、二分法、三元表达式

递归函数

函数不仅可以嵌套定义,还可以嵌套调用,即在函数调用过程中,函数内部又调用另一个函数,而函数的递归调用指的是在调用一个函数的过程中又间接或者直接的调用该函数本身


def index():
    print('from index')
    func()
def func():
    print('from func')
    index()

func()

 这种情况下的递归调用是一个无线循环的过程,但是python对函数的递归调用的深度做了限制,所以并不会进入无线循环,会抛出异常,如果要避免这种情况,就必须让递归调用有个结束条件

#可以使用sys.getrecursionlimit()去查看递归深度,默认值是1000

递推与回溯

 比如,问班级里第四排同学的年龄,他说比第三排多2岁,第三排说比第二排同学多2岁,第二排又比第一排多2岁,第一排说我18岁

age(4)=age(3)+2
age(3)=age(2)+2
age(2)=age(1)+2
age(1)=18
#总结为
age(n)=age(n-1)+2
age(1)=18

 这是一个递推的过程,就是一层层向下寻找答案。

回溯阶段就是,通过最好一个结果往回寻找最开始的答案

#用代码实现
def age(n):
    if n==1:
        return 18
    return age(n-1)+2
res=age(4)
print(res)

算法(二分法、冒泡、选择排序等)

算法就是解决问题的高效方法

算法中的二分法、冒泡排序、选择排序、堆排序、等
二分法例子

查一个数字在列表中是否存在

l = [11, 2, 3, 43, 55, 67, 23, 45, 45, 88, 99, 66,]
l.sort()
def my_half(l,target_num):
    if len(l) == 0:
        print('没找到')
        return
    middle_index=len(l)//2
    if target_num > l[middle_index]:
        l_right=l[middle_index+1:]
        # print(l_right)
        my_half(l_right,target_num)
    elif target_num<l[middle_index]:
        l_left=l[:middle_index]
        my_half(l_left,target_num)
    else:
        print('找到了')
my_half(l,40)

 

三元表达式

def my_max(a, b):
    if a >b:
        return a
    else
        return b

比较大小的函数

这种二选一的情况下,推荐使用三元表达式


def compare_sizes(a,b):
    return a if a>b else b
print(compare_sizes(1,2))

语法结构:条件成立之后的结果 if 条件 else 条件不成立之后的结果 

三元表达式也支持嵌套,一般面试题用

res = 2 if 2 > 10 else ( 10 if False else (100 if 10 > 5 else (2 if False else 1)))
print(res)#100

列表生成式

给一个列表内的元素都加上 _666 

names_list = ['kevin', 'jerry', 'tank', 'oscar']
new_names_list=[]
for name in names_list:
    res='%s_666' %name
    new_names_list.append(res)
print(new_names_list)

用列表生成式来实现

res=[name + '_666' for name in names_list]
print(res)

列表中得每一个名字都拼接上后缀:_SB,除jerry之外

new_names_list=[]
for name in names_list:
    if name =='jerry':
        new_names_list.append(name)
    else:
        res='%s_sb' %name
        new_names_list.append(res)
print(new_names_list)

用列表生成式实现

res=[name + '_sb' if name!= 'jerry' else name for name in names_list]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值