最重要Python面试题,逻辑题,Python与数学之美

article/2025/10/9 9:06:59

从数学归纳法谈起:

 

什么是数学归纳法?

 

从两个有趣的问题谈起:

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)


http://chatgpt.dhexx.cn/article/I8rEJAui.shtml

相关文章

OpenCV--Python

1、cv2.imread()读入图像&#xff1b;第一个参数为图像路径&#xff1b;第二个为cv2.IMREAD_COLOR&#xff1a;读入彩色图像&#xff1b;cv2.IMREAD_GRAYSCALE:读入灰度图像。 2、显示图像cv2.imshow() 3、保存图像cv2.imwrite() 4、获取视频先创建一个videocapture对象。参…

python - Pandas基础

pandas 简介 基于numpy的工具 高效提供了大量库和一些标准的数据模型 相当于Numpy的一维数组,但是与普通的一维数组不同,Series支持对数据的自定义标签也就是index(索引)&#xff0c;通过索引可以访问Series的元素 Series 索引 简单的创建 import pandas as pd sel pd.…

【阿里内部教程】python初阶:基础语法 python全栈自动化测试系类

目录 很多小伙伴可能都没有看过凡哥的视频&#xff0c;所以大家可能对凡哥不是很了解这里先和大家来个自我介绍 凡哥我已经有着十二年互联网自动化测试和测试开发工程师&#xff0c;拥有丰富的自动化测试平台及测试开发经验&#xff0c;擅长接口测试、Python自动化全栈&#x…

opencv python 常用方法

点击&#xff1a;OpenCV--Python 基本使用 一、基本方法 1、cv2.imread() 读入图像&#xff1b;第一个参数为图像路径&#xff1b;第二个为cv2.IMREAD_COLOR&#xff1a;读入彩色图像&#xff1b;cv2.IMREAD_GRAYSCALE:读入灰度图像。 import cv2 import matplotlib.pyplot …

iOS开发通过微信学习WCDB(四)

最近打算将封装一个基于wcdb操作的数据库私有库&#xff0c;在封装使用的过程中遇到了一些问题&#xff0c;将问题整理了一下&#xff0c;分享给大家。 私有pod库依赖于WCDB 造成lint失败 最开始遇到这个问题的时没有眉目&#xff0c;后来看到打包方式都是静态库&#xff0c;后…

微信移动端数据库组件WCDB系列(二) — 数据库修复三板斧

前言 长久以来SQLite DB都有损坏问题&#xff0c;从Android、iOS等移动系统&#xff0c;到Windows、Linux 等桌面系统都会出现。由于微信所有消息都保存在DB&#xff0c;服务端不保留备份&#xff0c;一旦损坏将导致用户消息被清空&#xff0c;显然不能接受。 我们即将开源的移…

微信 WCDB for Android的接入

接入 WCDB Android 项目接入 WCDB&#xff0c;可以选择通过 Maven 接入或通过 AAR 包接入。 通过 Maven 接入 对于大部分开发者&#xff0c;推荐使用 Maven 接入 WCDB&#xff0c;在 APP 模块的 build.gradle 下添加 WCDB 依赖即可 dependencies {// 修改"1.0.0"…

关于WCDB Swift 的一些简易使用

wcdb 开源地址&#xff1a;https://github.com/Tencent/wcdb 一、wcdb介绍 引用官方说法&#xff1a;“WCDB Swift 是一个易用、高效、完整的移动数据库框架&#xff0c;它基于 SQLite 和 SQLCipher 开发。” 鹅厂出品的值得信赖。于是就打算在新的项目中使用它。 三大特性…

微信 WCDB 正式开源——高效易用的移动数据库框架

前沿介绍 腾讯开源微信数据库框架WCDB,他是一个高效、完整、易用的移动数据库框架&#xff0c;基于SQLCipher&#xff0c;支持iOS, macOS和Android。 便捷地定义表、索引、约束&#xff0c;并进行增删改查操作 项目演示效果如下&#xff1a; 微信 即时通讯软件 微信&#x…

Wcdb android 目录,WCDB漫谈

前言 移动端的数据库选型一直是一个难题&#xff0c;直到前段时间看到了WeMobileDev(微信前端团队)放出了第三个开源组件-WCDB WCDB(WeChat DataBase)是微信官方的移动端数据库组件&#xff0c;致力于提供一个高效、易用、完整的移动端存储方案 微信团队怎么说 基于SQLCipher W…

iOS开发-关于微信WCDB的使用 WCDB嵌套模型的使用

iOS开发-关于微信WCDB的使用 WCDB嵌套模型的使用 前言开发前准备开发关于生成WCDB文件 选择new file即可找到关于嵌套模型的生成 分两步 选择new file即可找到增删改查的封装使用 总结 前言 iOS开发中有需要数据库的存储&#xff0c;表的增删改查等&#xff0c;FMDB和最近流行…

iOS开发通过微信学习WCDB(三)

通过之前的两篇文章对wcdb能够简单的使用了&#xff0c;这些知识储备多时&#xff0c;最近终于可以派上用场了&#xff0c;最近app有一个通讯录的新功能&#xff0c;实现联系人列表的排序&#xff0c;以及检索&#xff0c;刚好可以用用wcdb去实现。 联系人模型的建立 我首先建…

WCDB使用笔记

本地数据加密 由于项目涉及到一些用户隐私数据的存储&#xff0c;所以需要对保存在客户端本地的数据进行加密&#xff0c;以防止用户隐私数据在设备被root的情况下出现泄漏。目前android的本地数据存储基本分为file&#xff0c;sharepreference和database&#xff0c;所以对数…

iOS开发通过微信学习WCDB(一)

最近通过对微信ipa包解压发现微信有使用WCDB这个开源库&#xff0c;搜索了一下了解到WCDB&#xff08;WeChat Database&#xff09;是一个高效、完整、易用的移动数据库框架&#xff0c;基于SQLCipher&#xff0c;支持iOS, macOS和Android。经过分析对比&#xff0c;个人感觉WC…

微信移动端数据库组件 WCDB 系列(三) — 解析 WINQ 原理

背景 高效、完整、易用是 WCDB 的基本原则。前几篇文章分享了 WCDB 的基本用法和修复工具&#xff0c;接下来将更深入地聊聊 WCDB 在易用性上的思考和实践。 对于各类客户端数据库&#xff0c;似乎都绕不开拼接字符串这一步。即便在 Realm 这样的 NoSQL 的数据库中&#xff0…

WCDB源码解析

源文链接&#xff1a;http://xiangwangfeng.com/2018/01/08/WCDB-源码解析 起因 最近开了个新项目&#xff0c;项目的主程童鞋引入了 WCDB 代替原先自制的 KeyValueStore 和 FMDB。问为何&#xff0c;答曰&#xff1a;好用&#xff0c;线程安全又高效。又问具体实现细节&#x…

IOS数据存储 之WCDB (二)WCDB.swift使用篇

IOS数据存储 之WCDB &#xff08;二&#xff09;WCDB.swift使用篇 1.WCDB.Swfit基础使用1.1 WCDB.Swfit 简介1.1.1 模型绑定1.1.2 创建数据库与表1.1.3 操作数据1.1.3.1 插入操作1.1.3.2 查找操作1.1.3.3 更新操作1.1.3.4 删除操作 1.2. 模型绑定1.2.1 Swift 模型绑定1.2.2 字段…

Android使用WCDB+Room 总结

最近项目有需要用到wcdb数据库&#xff0c;并且保证和IOS互通数据&#xff0c;在网上找很多相关资料&#xff0c;最后还是靠自己一点点摸索成功&#xff0c;现在做个总结。 一、在gradle 里加上 WCDB 相关的 room 组件 def room_version "2.3.0"// wcdb数据库和roo…

IOS数据存储 之WCDB (一)

IOS数据存储 之WCDB &#xff08;一&#xff09; 1. WCDB 简介1.1 使用WCDB框架3大优势1.2 WCDB 的一些基础概念1.2.1 类字段绑定&#xff08;ORM&#xff09;1.2.2 WINQ&#xff08;WCDB语言集成查询&#xff09;1.2.2.1 字段映射与运算符1.2.2.2 字段组合1.2.2.3 AllProperti…

iOS开发 数据存储之WCDB的介绍

一.介绍 WCDB是一个高效、完整、易用的移动数据库框架,基于SQLCipher,支持iOS,macOS和Android 二.基本特性 易用,WCDB支持一句代码即可将数据取出并组合为object WINQ(WCDB语言集成查询):通过WINQ,开发者无须为了拼接SQL的字符串而写一大坨胶水代码ORM(Object Relational Ma…