【周周Python百日刷题计划】Day6~初识算法与递归

目录

例一前言

例一要求

例一解析

二分法流程图分析

例一答案

例二前言

​​​​​例二要求

例二解析

例二答案

例题二思考

最后


例一前言

如果有一个列表 'l',要 让你从这个列表中找到66的位置,你要怎么做?

l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]

你可能使用以下方法会很简单的到结果:

l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
print('l中66的索引位置是:',l.index(66))

输出结果:
l中66的索引位置是: 17

我们之所以用index方法可以找到,是因为python内部帮我们实现了查找方法。如果题目明确规定index方法不给你用了,并且只能够使用算法查找,你还能找到这个66么?

例一要求

使用二分查找算法实现列表中index方法的功能,例如给你一个列表

l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]

通过调用你写的find函数可以返回该列表中你想查找的元素的下标,如果你想查找的元素不在该列表中调用find函数则返回'你想要的值不在该列表中'

例一解析

  • 简述一下算法:

        我们学习的算法都是过去时,只有我们了解基础算法,才能够创造出更好的算法,不是

所有的事情都能套用现成的方法解决,有的时候会用到学过的算法知识来解决新的问题。

  • 二分法的使用条件:

1)数组为有序数组。

2)同时题目还强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的。        

解决本题之前应该要熟悉递归函数的使用方法以及二分法的条件

二分法流程图分析

比如们要在列表中找到元素66对应的位置,应该将每一次列表的中间数与66进行比较,第一次比较中间值41<66,则说明66位于41的右边,则下一次取41右边的所有数的中间值与66进行比较,以此类推直到中间值与66相同就找到了66所在的位置。

【周周Python百日刷题计划】Day6~初识算法与递归_第1张图片

 

例一答案

l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
#确定函数的参数l为想找元素所在的列表,aim为想找的元素,其他为默认参数
def find(l,aim,start=0,end=None):              
    end = len(l) if end is None else end
    mid_index = (end - start) // 2 + start    #求中间值mid_index
    if start <= end:                          #若start > end则说明元素不在该列表中
        if aim > l[mid_index]:
            return find(l,aim,start = mid_index + 1,end=end)
        if aim < l[mid_index]:
            return find(l, aim,start=start,end=mid_index - 1)
        else:
            return mid_index
    else:
        print('你想要的值不在该列表中')

例二前言

这里我们又要举个例子来说明递归能做的事情。

例二:

现在你们问我,A同学多大了?我说我不告诉你,但A同学比 B同学大两岁。

你想知道A同学多大,你是不是还得去问B同学的年龄?B同学说,我也不告诉你,但我比C同学大两岁。

你又问C同学的年龄,C同学也不告诉你,他说他比D同学大两岁。

那你问D同学,D同学终于告诉你,他18了。

这个时候你是不是就知道了?A同学多大?

【周周Python百日刷题计划】Day6~初识算法与递归_第2张图片

 

​​​​​例二要求

使用递归函数求得各个同学的年龄

例二解析

本题难度十分小,主要是了解递归

递归函数:在一个函数里在调用这个函数本身。

递归的最大深度:998

正如你们刚刚看到的,递归函数如果不受到外力的阻止会一直执行下去。但是我们之前已经说过关于函数调用的问题,每一次函数调用都会产生一个属于它自己的名称空间,如果一直调用下去,就会造成名称空间占用太多内存的问题,于是python为了杜绝此类现象,强制的将递归层数控制在了997

条件:
    1、超过最大递归限制的报错
    2、只要写递归函数,必须有结束条件
返回值:
    1、不要只看到return就认为已经返回了,要看返回操作是在递归的第几层的时候发生的
    然后返回给了谁
    2、如果不是返回给了最外层函数,调用者就接收不到,需要再分析,看如何把结果返回回来

例二答案

参数n表示想找学生的序号:例A(n = 1),B(n = 2)……

def age(n):
    if n == 4:
        return 18
    else:
        return age(n+1) + 2

例题二思考

找出下面代码出错的原因,为什么没写return不是返回None而是报错呢?以及为什么会出现以下的错误类型

def age(n):
    if n == 4:
        return 18
    else:
        age(n+1) + 2

print(age(2))

输出结果:
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'
错误翻译:
TypeError:+ 不支持的操作数类型:“NoneType”和“int”

结合以下代码分析

【周周Python百日刷题计划】Day6~初识算法与递归_第3张图片

 

 

最后

感谢各位能够看到这里:在鲁迅一篇未发表的文章中说过:“代码看懂了不是懂✨一定要自己实际操作哇✨这样才能更好的理解和吸收。”
最后来一句:一个人可以在任何他怀有无限热忱的事情上成功,让我们一起进步吧✨✨

【周周Python百日刷题计划】Day6~初识算法与递归_第4张图片

你可能感兴趣的:(#,【周周Python习题集】,python,开发语言)