点击蓝字“莫名Coder”关注我哟
加个“星标★”,每日良时,好文必达!
递归
递归是很多算法都使用的一种编程方法。
试想一下,你的女朋友给你买了一份礼物,女朋友告诉你礼物就在盒子里面。
这个盒子里面有盒子,而盒子里面套着盒子,礼物就在某个盒子里面。想一想这个问题,再接着往下看。
第一种方法:
1.创建一个要查找的盒子堆;
2.从盒子里面取出一个盒子,在里面找;
3.如果找到的是盒子,将其放到盒子堆中,以便以后在查找;
4.如果找到的是礼物,大功告成;
5.回到第二步
第二种方法:
1.检查盒子中的每样东西
2.如果是盒子,就回到第一步
3.如果是礼物,就大功告成
伪代码实现:
# 第一种
def look_for_gift(box):
pile = box.make_a_pile_to_look_through()
while pile is not empty:
b = pile.grab_a_box()
for item in b:
if item.is_a_box():
pile.append(item)
elif item.is_a_key():
print("找到礼物了")
# 第二种
def look_for_gift(box):
for item in box:
if item.is_a_box():
look_for_gift(item)
elif item.is_a_key():
print("找到礼物了")
这两种方法作用基本相同,在我看来,第二种更加简洁,处理方式更加清晰。
基线条件和递归条件
由于函数调用自己,如果递归条件出错,那么导致无线循环。因此每个递归函数由两部分:基线条件和递归条件。递归条件指的是函数调用自己,而基线条件指的是函数不再调用自己,从而避免形成无线循环。
栈
众所周知,大家都用过清单或者待办事项。插入待办事项放到清单的最前面,读取事项的时候,只需要读取最上面的那个,将其删除。两种操作:插入和弹出。
调用栈
计算机在内部使用被称为调用栈。定义一个函数:
def greet(name):
print("hello , " + name + "!")
greet2(name)
print("getting ready to say bye")
bye()
调用greet()函数,在调用另外两个函数,示例:
def greet2(name):
print("how are you," + name + "?")
def bye():
print("ok bye!")
假设我们调用了greet("luck"),计算机中首先为该函数分配一块内存,使用内存,变量name被设置为luck,这就需要存储到内存中。
当你调用函数时,计算机将变量的值存储于内存中,接下来打印hello luck再调用greet2()函数,同样,计算机也为这个函数分配一块内存。
注意
递归指的是调用自己的函数
递归函数有基线条件和递归条件
栈有两种操作,压入和弹出
所有函数调用都进入调用栈
---END---
莫名Coder
关于 Python 都在这里