python 之递归及冒泡排序

一.递归函数

在函数内部,可以调用其他函数,如果一个函数在内部调用本身,这个函数就是递归函数

1.递归的基本原理

  • 每一次函数调用都会有一次返回.当程序流执行到某一级递归的结尾处时,它会转移到前一级递归继续执行(调用本身函数)
  • 递归函数中,位于递归调用前的语句和各级被调函数具有相同的顺序
  • 虽然每一级递归有自己的变量,但是函数代码并不会得到复制
  • 递归函数中必须包含可以终止递归调用的语句

举例:

>>> def fun2(i):
...     r = fun2(i+1)
...     return r

递归函数中没有包含终止递归调用的语句,此函数将一直返回循环执行下去,加终止条件当满足条件时会结束函数

def fun(i):
    print(i)
    if i == 5:
        return 5
    r = fun(i + 1)
    return r
fun(1)

举例:

阶乘,计算整数n:n!=1*2*3*4*5*..*n

如果用函数fun(n) 可以表示为:

fun(n)=1*2*3*4*5*..*n=fun(n-1)*n

如果用递归函数

>>> def fun(n):
...     if n == 1:
...             return 1
...     return fun(n-1) * n
...
>>> fun(2)
2
>>> fun(10)
3628800

举例:

写函数,利用递归获取斐波那契数列中的第 10 个数,并将该值返回给调用者

#!/usr/bin/env python# -*- coding:utf-8 -*-def fun2(depth, a1, a2):
    if depth == 10:
        return a1
    a3 = a1 + a2
    r = fun2(depth + 1, a2, a3)
    return  r
ret = fun2(1,0,1)
print(ret)

递归小结:

   递归的目的是简化程序设计,使程序易读。   
    但递归增加了系统开销。 时间上, 执行调用与返回的额外工作要占用CPU时间。空间上,随着每递归一次,栈内存就多占用一截。

二.冒泡排序

  冒泡排序一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

冒泡排序算法的运作如下:

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

例:

li = [22, 12, 33, 21]
for i in range(1,len(li)):
    for j in range(len(li) - i):
        if li[j] > li[j + 1]:
            temp = li[j]
            li[j] = li[j + 1]
            li[j + 1] = temp
print(li)
时间: 2024-10-14 07:45:56

python 之递归及冒泡排序的相关文章

关于python最大递归深度 - 998

今天LeetCode的时候暴力求解233 问题: 给定一个整数 n,计算所有小于等于 n 的非负数中数字1出现的个数. 例如: 给定 n = 13, 返回 6,因为数字1出现在下数中出现:1,10,11,12,13. 代码: class Solution: def __init__(self): self.key = '1' self.result = 0 def countDigitOne(self, n): """ :type n: int :rtype: int &qu

python的递归

今天,我们要讲的内容是关于python的递归. 什么是递归?看这个名字,你也许能够猜出个大概.关于递归,我们有一个很经典的应用,就是我们以前高中一些数学题目中的累乘,像n *(n-1)* (n-2) * ... * 1.在这里,如果要让你计算最终的结果,你可能会想到用for循环来实现,但是,我们在这里可以稍微进行优化一下,比如像这个例子一样: #for循环 def LSF(n): result = n for i in range(1,n): result *= i return result

python学习(递归)

一. 递归 递归就是函数自己调用自己 python中递归最大可用深度是997 递归可以用来遍历各种树形结构 #用递归方法查看某一个路径内的文件内容 import os filepath = 'd:\资料下载' #要打开的文件路径 def read(filepath,n): #n为递归深度,也就是用来控制缩进的数量 it = os.listdir(filepath) #按照给出的文件路径打开文件, 返回的it是一个可迭代对象 # print("__next__"in dir(it)) #

六. python进阶(递归)

一 .递归 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 递归函数: 一个会调用自身的函数称为递归函数凡是循环能干的事情 递归都能干方式: 写出临界条件 我这一次和上一次的关系 假设当前函数已经能用 调用自身计算上一次结果 在求出本次的结果 必须有一个明确的结束条件:每次进入更深一层递归时,问题规模相比上次递归都应有所减少相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入).递归效率不高,递归层次过多会导致栈溢出(在计

python-学习笔记之-Day5 双层装饰器 字符串格式化 python模块 递归 生成器 迭代器 序列化

1.双层装饰器 #!/usr/bin/env python # -*- coding: utf-8 -*- # author:zml LOGIN_INFO = False IS_ADMIN = False   def check_log(func): def inner(): res = func() if LOGIN_INFO: print('验证成功!') return res else: print('验证失败!') return inner   def check_admin(func)

python函数递归和生成器

一.什么是递归 如果函数包含了对其自身的调用,该函数就是递归的.递归做为一种算法在程序设计语言中广泛应用,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量.例如,要计算1-9的9位数字的乘积,直观的算法是1*2*3*4*5*6*7*8*9,如果要计算1-10000的乘积,直观的算法就难于实现出,而递归就可以很简单的实现.请看示例: 1 def fact(n):#计算给定数字到一的乘积

阶乘、斐波那契数列、打印三角形(*)递归,冒泡排序

1.用递归求阶乘 5*4*3*2*1 static int Show(int num)//Show(5) { if (num <= 0) return 1; else return num*Show(num-1); } 2.斐波那契数列,1.1.2.3.5.8.13 求出第三十位 static int Show(int num)// Show(30) { if (num == 0 || num < 0) return 0; else if (num == 1 || num == 2) retu

初试Python语法小试牛刀之冒泡排序

Python很火,心里很慌,没吃过猪肉,也要见见猪走路. 看了几天Python的语法,大概初步了解了一点点,https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000 想综合起来练习一下Python的语法,就从最简答的冒泡排序开始吧. 鉴于Python的灵活性,甚至可以不需要类,不需要main方法,仅仅写个方法然后执行方法就可以运行, 以下简单尝试从类Class的角度来封装一个最最简单的方

Python之递归

所谓递归其实就是函数本身调用函数,直到满足指定条件之后一层层退出函数, 例如 从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?"从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?'从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?--'" 利用函数编写一个斐波那契数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,258