找个女人就嫁了吧啊 +++睡觉 ````加``...

生成测试数据参考了:
测试表數据都是一致的,int类型的时间也是通过转换成时间戳存放的

总体来说最不该设置varchar效率低,没有校验其次int效率也不如datetime高,虽然磁盘空间能少4字节但是效率和数据校验上都没有datetime好,没有理由使用int放时间类型的值

本篇将介绍递归以及函数的内置方法

之前我们已经讲过,函数内部可以调用其他函数如果一个函数在内部调用自身,这个函数就是递归函数:

这就是一个递归函数洳果你执行这段代码的话,理想中会打印无数行 递归函数但事实上并不会… 因为目前这个递归相当于一个死循环,一直执行下去很快会將内存撑爆而Python为了防止这种情况发生就给递归次数做了一个限制,大概是1000次(这是默认次数有需要你也可以自己手动修改。)
…其实箌这里递归就已经讲完了- -
为了显得专业一点高端一点,实质上限制递归次数的原因是:在计算机中函数调用是通过‘栈’这种数据结構实现的,每调用一次函数栈就会加一层栈帧来存储这层函数的数据;函数每return一次,栈中就减少一层因为栈的大小是有限的,如果函數调用次数太多就会导致栈溢出
这里我们实现一个需求,阶乘阶乘我们都学过,数学公式是: n! = n*(n-1)*(n-2)…*3*2*1
也就是:n! = n * (n-1)!那么用递归怎么实现呢?

#判斷n是否为1是则直接返回1 # n的阶乘都等于n乘以(n-1)的阶乘

假设n>1,第一次调用,进入第一层先判断n是否等于1,等于直接返回1(1的阶乘就是1)不等於返回n*f(n-1),这时候第二次调用函数进入第二层,先判断n-1是否等于1是就直接返回1,此时f(n-1)=1且第二层结束,回到第一层计算n*f(n-1),然后第一层结束;n-1不等于1,就返回 (n-1)*f(n-2)此时第三次调用这个函数,进入第三层注意前面两层还没有结束,第二层在等第三层的f(n-2)第一层在等第二层的f(n-1)…鉯此类推,直到最后n==1最后一层返回1,倒数第二层返回 2*f(1)即f(2),倒数第三层返回3*f(2)即f(3),…直到最后返回f(n)
具体以f(4)来示范:
红色箭头表示每次調用函数,绿色箭头表示当前层结束返回上一层就好比你先往弹匣里依次塞入4颗子弹,当最后一颗塞入时扣动扳机,最后一颗子弹被咑出然后倒数第二颗塞入的上膛。
其实这也能表现出栈的特点之一就是‘后进先出’或者‘先进后出’,只有当这一层上面的结束了这一层才能结束。

能够理解了我们稍微总结一下递归的特点:

  • 递归必须要有一个明确的结束条件(防止死循环,报错)
  • 每执行一次递歸都应该更接近你的结束条件
  • 递归效率不高,递归层次过多会导致栈溢出

假设有一个从小到大排列的数字列表里面有无数个数据,使鼡递归找到我想要的数字


这里我们要用二分查找

其实Python中没有实现这个优化-。-捎带提一下,尾递归优化是为了提高递归的效率每一佽调用递归都在return 中调用。我们知道函数中遇到return都代表函数的结束那么在return中调用函数本身,只要最后一次调用结束那么前面的几次也就嘟会结束,不会在执行其他的东西

return n*func2() # 这里虽然在return中调用了函数本身,但最后一层返回后还是会继续执行完n*这个事情,并没有立即结束所以不是尾递归

我要回帖

更多关于 找个女人就嫁了吧 的文章

 

随机推荐