图解算法(三)

递归

  • 基线条件:函数不再调用的条件
  • 递归条件:函数调用的条件
def factorial(num):
    if num <= 1:                     #基线条件
        return 1
    else:                                     #调用条件
        return num*factorial(num-1)                   

如果使用循环,程序的性能可能更高;如果使用递归,程序可能 更容易理解。如何选择要看什么对你来说更重要。

调用栈

两种操作:压入-弹出
程序在执行过程中利用栈来保存程序执行的进度。比如:

def greet(name):
    greet2(name)
    print("how are you.")
    bye()
  • 调用函数greet("lucy"),计算机会先分配一块内存空间,将函数信息存储在内存中;在这里插入图片描述
  • 执行下一步代码
  • 执行greet2("lucy"),计算机在原有的基础上新分配一块内存空间在这里插入图片描述
    调用完成后取走
    在这里插入图片描述
    现在,栈顶的内存块是函数greet的,这意味着你返回到了函数greet。当你调用函数greet2 时,函数greet只执行了一部分。这是本节的一个重要概念:**调用另一个函数时,当前函数暂停 并处于未完成状态。**该函数的所有变量的值都还在内存中。执行完函数greet2后,你回到函数 greet,并从离开的地方开始接着往下执行。
    在这里插入图片描述

小结

 递归指的是调用自己的函数。
 每个递归函数都有两个条件:基线条件和递归条件。
 栈有两种操作:压入和弹出。
 所有函数调用都进入调用栈。
 调用栈可能很长,这将占用大量的内存。溢出

练习题

编写一个求最大值的函数

def max(alist):
	if len(alist) == 0:
		return 
	elif len(alist) == 1:
		return alist[0]
	elif len(alist) == 2:
		renturn alist[0] if alist[0]>alist[1] else alist[1]
	else:
		max_i = max(alist[1:])
		return  alist[0] if alist[0]>max_i else max_i
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值