从数学归纳法谈起:

什么是数学归纳法?

从两个有趣的问题谈起:

1)怎么证明一堆人中所有人都是希腊人?

2)思考题:怎么证明所有人都是秃子?

什么是数学归纳法?

最简单和常见的数学归纳法是证明当n等于任意一个自然数时某命题成立。证明分下面两步:

  1. 证明当n= 1时命题成立。
  2. 假设n=m时命题成立,那么可以推导出在n=m+1时命题也成立。(m代表任意自然数)

这种方法的原理在于:首先证明在某个起点值时命题成立,然后证明从一个值到下一个值的过程有效。当这两点都已经证明,那么任意值都可以通过反复使用这个方法推导出来。把这个方法想成多米诺效应也许更容易理解一些。例如:你有一列很长的直立着的多米诺骨牌,如果你可以:

  1. 证明第一张骨牌会倒。
  2. 证明只要任意一张骨牌倒了,那么与其相邻的下一张骨牌也会倒。

2)怎么证明所有人都是秃子?

我们知道有0根头发的人是秃子,有1根头发的人也是秃子;

假设有n根头发的人是秃子,那么有n+1根头发的人也是秃子;

所以,所有人都是秃子;

再来看一个实际的例子:

证明: 一棵完全有k层的完全二叉树有2^k-1个节点。

1)基准点:k=1 , 节点个数为2^k-1 = 1,很显然成立;

2)假设,对k=n, 这个结论仍然成立,2^n-1;

3) 要证明,对 k =n+1时,这个结论仍然成立 2^(n+1)-1

根据假设,现在的总结点是: (2^n-1)*2+1 = 2^(n+) - 1

来看看数学归纳法在计算机递归算法证明中的作用:

斐波那契数列的例子:

https://baike.baidu.com/item/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97/99145?fr=aladdin

这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:f(0)=1,f(1)=1, f(n)=f(n-1)+f(n-2)(n>2,n∈N*)

我们一般在做斐波那契数列时递归的代码很简单:

def Fib(n):

if n <= 1:

return 1

else:

return Fib(n-1)+Fib(n-2)

递归:指函数的定义中使用函数自身的方法;

怎么证明利用数学归纳法来证明这段程序的正确性?

1)对n = 0, Fib(0) 返回1, 等于f(0);

对n = 1, Fib(1)返回1, 等于f(1);

2)假设n >= 2, 对于所有的 2 <= m < n, Fib(m)返回f(m)

3) 下面,我们需要证明:F(n) = f(n)

则 F(n) = F(n-1) + F(n-2)

= f(n-1) + f(n-2) # 因为假设的存在

= f(n)

###########################################

# -*- coding:utf-8 -*-

# Fab(n) = Fab(n-1)+Fab(n-2) n > 2

# 1 n = 1,2

# n是大于0的自然数

# 用三种方法来实现:1.递归; 2.循环 3.yield

# 1,1,2,3,5,8,13,21,34,...

def Fab(n):

if n == 1 or n == 2:

return 1

return Fab(n-1)+Fab(n-2)

def Fab2(n):

index, a, b = 0, 1, 1

while index < n-2:

a, b = b, a+b

index += 1

return b

def Fab3(n):

index, a, b = 0, 0, 1

while index < n:

yield b

a, b = b, a+b

index += 1

import numpy as np

def fabFromMatrix(n):

if n <= 1:

return 1

f = np.mat('1 1; 1 0')

return (f**(n-1))[0,0]

if __name__ == '__main__':

print(Fab(7)) # 13

print(Fab2(7))

f = Fab3(7)

#print(f.next()) # python2 f.next()

print(next(f)) # python3 next(f)

print(next(f))

print(next(f))

#print(fabFromMatrix(7))

###########################################

思考题:

用递归算法求解一个数组的最大最小值,并用数学归纳法来证明算法的正确性;

再次来审视一下递归:

到底什么是递归?

一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。

递归能解决什么问题?

有很多数学公式可以使用递归(recursive)的方式来声明:

F(0) = 0 X = 0

F(X) = 2F(X-1)+X^2 X > 0

怎么来写一段递归代码?

作为练习;

递归一般来说要考虑两个基本法则:

1)基准情形(base case);必须得有最基准的情形,不用递归就能解决;

2)不断推进(making progress);对于那些需要递归求解的情形,递归调用必须总能朝着基准情形的方向推进;

递归中需要注意哪些问题?

Note:

def Bad( n ):# n必须是正整数

if n == 0:

return 0

else:

return Bad(n/3+1)+n-1 # 注意:这里有什么问题???

事实上Bad(1) 得不到!!!

其实,斐波那契数列可以使用循环重写。

循环和递归到底有什么差别?

循环: 为了获得一个结果,不断重复执行同一代码块;必须得有一个终止条件;

循环时状态不断的更新;

递归:重复执行某个执行流程;但是代码段有自己独立的栈空间;终止条件通过基线条件来确定,当前状态变化通过参数传递的方式来完成的;独立的栈空空间是递归崩溃的本源;可读性很高;

四个基本的法则:

1)基准情形;必须有基准的情形,它无须递归就能解出;

2)不断推进;每一次递归调用都必须使求解状况朝接近基准情形的方向推进;

3)设计法则;假设所有的递归调用都能运行;

4)合成效益法则(compound interest rule); 在求解一个问题的同一个实例时,切勿在不同的递归调用中做重复性的工作;使用递归来计算诸如斐波那契数列数列之类的简单数学函数的值的想法并不是一个好主意,因为第四条;

递归最大的缺陷:

1)空间上开辟大量的栈空间;

2)时间上有避免重复;

什么是尾递归(tail-call)优化?

举个例子:

def print100(n):

if n <= 100:

print(n)

print100(n+1)

print100(1)

尾递归: 最后一件事情是一个递归的函数,这种行为称为尾递归;

实例:

汉诺塔问题

汉诺塔是印度一个古老传说的益智玩具。汉诺塔的移动也可以看做是递归函数。

我们对柱子编号为a, b, c,将所有圆盘从a移到c可以描述为:

如果a只有一个圆盘,可以直接移动到c;

如果a有N个圆盘,可以看成a有1个圆盘(底盘) + (N-1)个圆盘,首先需要把 (N-1) 个圆盘移动到 b,然后,将 a的最后一个圆盘移动到c,再将b的(N-1)个圆盘移动到c。

请编写一个函数,给定输入 n, a, b, c,打印出移动的步骤:

move(n, a, b, c)

例如,输入 move(2, ‘A’, ‘B’, ‘C’),打印出:

A –> B

A –> C

B –> C

背景资料:

汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

简单的实现(有没有办法实现非递归的实现呢?):

def move(n, a, b, c):

if n==1:

print(a,'-->',c)

return

else:

move(n-1,a,c,b) #首先需要把 (N-1) 个圆盘移动到 b

move(1,a,b,c) #将a的最后一个圆盘移动到c

move(n-1,b,a,c) #再将b的(N-1)个圆盘移动到c

#move(4, 'A', 'B', 'C')

#move(3, 'A', 'B', 'C')

move(2, 'A', 'B', 'C')

印度传说是有64个金片,这就是所谓梵塔;一秒移动一次,大约需要5800亿年。

我们太阳系大约还能维持100-150亿年。

递归例题:

1)用递归的方法,找出从1到最大的N位整数;

例子:给出N=1,返回【1,2,3,。。。,9】;

给出N=2,返回【1,2,3,。。。,99】;

class Solution:

#@param n:An interger.

# return: A list of integer storing 1 to the largest number with n digtis.

2)斐波那契数列, 动态规划等做时间上的优化;

怎么优化递归的操作?

压栈,空间的效率低;层次过多可能导致栈溢出;

怎么办?可以改成循环;

如果没有压栈操作,可以做尾递归优化(等价于优化);

3)快速排序算法 (nlogn)

# 5 2 6 8 7 9 0

#以5作为参考点pivot

# 目标: 2 0 5 6 8 7 9

#过程:

# i: 0

# 1 record 1 i+1 = 1

# 2:6 3:8 4:7 5:9

# 6: 0 i+1 = 2

class MySort:

# 快速排序

def quickSort(self, array, start, end):

if start < end:

# povit_index是基准点

povit_index = self.partition(array, start, end)

self.quickSort(array, start, povit_index)

self.quickSort(array, povit_index+1, end)

# 快速排序的分区过程

def partition(self, array, start, end):

povit_index = start # 基准点默认使用第一个元素的下标

povit = array[povit_index]

for i in range(start+1, end):

if array[i] < povit:

povit_index += 1

if povit_index != i:

array[i],array[povit_index] = array[povit_index],array[i]

array[start],array[povit_index] = array[povit_index], array[start]

return povit_index

def sort(self, A):

self.quickSort(A, 0, len(A))

A = [5, 2, 6, 8, 7, 9, 0]

mySort = MySort()

mySort.sort(A)

print(A)

最重要Python面试题,逻辑题,Python与数学之美相关推荐

  1. 点开瞅瞅,再来几道Python面试题吧,Python面试题No20

    文章目录 本面试题题库,由公号:非本科程序员 整理发布 第1题:如何理解 Django 被称为 MTV 模式? 第2题:解释下什么是 ORM 以及它的优缺点是什么? 第3题:Django 系统中如何配 ...

  2. 视频教程-大牛带你全面剖析Python高频面试真题-Python

    大牛带你全面剖析Python高频面试真题 毕业于德国奥格斯堡大学计算机系,先从事分布式网络,搜索引擎等领域的设计开发工作,于2017底混入图灵学院,立志挑战传统培训,做中国最好的Python教育 刘英 ...

  3. python笔试题110题_吐血整理:110道python面试题(带答案)

    原博文 2020-06-22 05:23 − 吐血整理:110道python面试题(带答案) 一.总结 一句话总结: 人生如负重致远不可急躁,但是要抓紧干活. 1.一行代码实现1--100之和? su ...

  4. Python面试题 - 基础题(一)

    1.为什么学习Python? 说到这个问题,就觉得有点难以启齿.自己对学习Java一直很抗拒,Python相对Java来说比较简单,再加上硕士期间一直都是使用Python进行数据挖掘和人工智能方面的实 ...

  5. 三年python面试题_300道Python面试题

    原标题:300道Python面试题 Python 工程师也分不同的技术岗位,初级.中级与高级开发工程师需要具备的技能也不同. 然而,无论是零经验还是 Python 老司机,对待每一次面试与笔试,都不能 ...

  6. [Python面试][基础算法题]Python基础面试(基础算法题目较多)

    Python基础 文件操作 1.有一个jsonline格式的文件file.txt大小约为10K 2.补充缺失的代码 模块与包 3.输入日期, 判断这一天是这一年的第几天? 4.打乱一个排好序的list ...

  7. 大厂python面试题_BAT大厂Python面试题精选,看完后离拿到offer只有一步之遥(含答案)...

    Python是目前编程领域最受欢迎的语言.在本文中,我将总结华为.阿里巴巴等互联网公司Python面试中最常见的30个问题.每道题都提供参考答案,希望能够帮助你在求职面试中脱颖而出,找到一份高薪工作. ...

  8. python面试题_17道Python面试题,分享给你以防不测!

    今天给大家分享的是Python面试题系列的第一篇文章,后续我也会陆续整理Python相关的问题给大家,无论是求职者还是新人都可以通过面试题来考察自己的能力缺陷. 1.Python中pass语句的作用是 ...

  9. 软件测试之python面试题_常见Python面试题整理带答案

    总结了一些经常遇到的Python面试题,让我们一起撸起来. 01.求出1-100之间的和 # coidng:utf-8 a = 0 for i in range(0,100): a += (i+1) ...

  10. python入门作业编程题-python入门(一)作业

    一,流程控制之if...else 1. 如果:女人的年龄>30岁,那么:叫阿姨,否则:叫小妞 1 age_of_girl = 21 2 if age_of_girl >30:3 print ...

最新文章

  1. 8500WN流畅高速上网高端卡 12核心不锁倍频
  2. 【安全系列之XSS】XSS攻击测试以及防御
  3. Ansible基础概述
  4. JAVA三角海伦公式,海伦公式求三角形面积出错求教
  5. 亚马逊无人商店因拒收现金被美国多地禁止:被认定歧视消费者
  6. 引用和指针自增的不同
  7. 中级软件设计师笔记全套 看完你就过啦
  8. APNS(Apple Push Notification Service)远程推送原理解析
  9. 实现多余文字显示省略号
  10. android cursor循环,Android:Cursor.getColumnIndex()在行循环中是不变的吗?
  11. 大数据分析技术与应用
  12. 数学7大定理比较,五点(驻、极、最、拐、间)比较,求极值问题(求根验证负数形式)
  13. 辅助驾驶功能开发-功能规范篇(04)- 交通拥堵辅助及集成式巡航辅助TJA/ICA
  14. 阔密保密专家:数字货币将要来临 你的手机安全吗?
  15. 05 linux shell脚本 变量的取用echo;变量的设置和修改;变量的使用规范以及示例
  16. 利用飞信接口免费发短信
  17. 二、自己需求函数的模块化
  18. 怎么判断两个工程师谁的代码能力强?【改编】
  19. IT实施计划实战经验分享:避免失败
  20. ibm tivoli_IBM Tivoli Directory Server 6.0的SSL配置

热门文章

  1. python中文转拼音实例_Python 将中文转拼音
  2. ubuntu 安装ATI驱动
  3. Python综合小应用 —— 胖子老板香烟管理系统
  4. Discuz!论坛各版本通用SEO优化设置教程
  5. 2019智能手表推荐_智能手表哪款好?2020智能手表推荐
  6. java实验报告可下载_JAVA实验报告.doc
  7. 记:.net中海关终端节点报文加签与推送
  8. Android-回传数据(装备选择)
  9. 用java实现原神自动弹琴(附谱)
  10. android5.0源码开发之NVRam存储,恢复出厂设置数据不被擦除--上篇