python递归调用详解_python中递归调用

递归一个通俗的解释就是,在函数中调用函数本身;伪代码如下:

In [31]: def fun():

....: fun()

# 这个递归没有任何作用,只是为了说明什么是递归

递归(Recursion),在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。

在使用递归时,需要注意以下几点:

递归就是在过程或函数里调用自身

必须有一个明确的递归结束条件,称为递归出口。

注意: 切勿忘记递归出口,避免函数无限调用。

使用递归计算的一些方法

第一个阶乘:

阶乘的定义:

1的阶乘是1

大于1的树n的阶乘是n乘以(n-1)

def fun(n): #使用递归定义

if n == 1:

return n

else:

return n * fun(n-1)

fun(5)

Out[72]: 120

def fun1(n): # 使用非递归

result = n

for i in range(1,n):

result *= i

return result

fun1(5)

Out[74]: 120

第二个幂函数的实现

In [38]: def power1(x,y): # 不使用递归

....: result = 1

....: for i in range(y):

....: result *= x

....: return result

....:

In [39]: power1(2,5)

Out[39]: 32

In [43]: def power2(x,y): #递归实现

....: if y == 0:

....: return 1

....: else:

....: return x * power2(x, y-1)

....:

In [44]: power2(2,5)

Out[44]: 32

二分查找法

二分查找又叫折半查找:

#二分查找的队列必须是有序的

有如下一个列表

[2,5,6,7,21,54,67,76,87,98,100]

列表中有序的,用二分法查找列表中数字87的位置。

列表共有11个元素,首先折半11/2的值取6,第六个元素值为54.

87>54

所以87在列表的后半部分中。

然后再重复以上过程,直到找到数值为止。

二分查找的函数代码:(代码为python2.7的版本)

#!/usr/bin/env python

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

#二分法查找数值

import sys

import random

def UnsortList(): ###如果没有指定参数,随机生成一个序列

list = []

long = random.randint(0,100)

for i in range(long):

list.append(random.randint(0,10000))

return list

def BinarySearch(list, mark, low=0,uplow=None): #二分法查找

if not uplow:

uplow = len(list) -1

if low == uplow:

assert mark == list[uplow]

return uplow

else:

mid = (low + uplow) // 2

if mark > list[mid]:

return BinarySearch(list, mark,mid+1,uplow)

else:

return BinarySearch(list,mark,low,uplow=mid)

def SuijiMark(list): ###在列表中随机挑选一个要查找的数据

l = len(list)

mark = list[random.randint(0,l) - 1]

return mark

def main(): ####主函数

Ulist = []

print "1:随机产生列表,验证二分法"

print "2:用户自己输入数值生成列表,验证二分法"

answer = input("请输入对应的数字: ")

if answer == 1:

Ulist = UnsortList()

mark = SuijiMark(Ulist)

print "The list is %s" % Ulist

print "The mark is %s" % mark

print "The len of the list is %s " % len(Ulist)

elif answer == 2:

lang = input("请输入列表长度: ") ##根据输入的数值,组成列表

for i in range(lang):

Ulist.append(input("请输入列表第%d个值:" % (i + 1)))

mark = SuijiMark(Ulist)

print "the list is %s" % Ulist

print "the mark is %s" % mark

else:

print "请输入合法的数字"

Ulist.sort()

index = BinarySearch(Ulist, mark)

print "The index %s is %s" % (index, mark)

if __name__ == "__main__":

main()

执行结果如下:

[root@mgto7 ~]# python erfen.py

1:随机产生列表,验证二分法

2:用户自己输入数值生成列表,验证二分法

请输入对应的数字: 1

The list is [4204, 3199, 8884, 4555, 4941, 5695, 5730, 7363, 5357, 7193, 532, 8270, 1173, 1526, 3278, 7526, 6461, 6470, 3962, 533, 5816]

The mark is 7526

The len of the list is 21

The index 18 is 7526

[root@mgto7 ~]# python erfen.py

1:随机产生列表,验证二分法

2:用户自己输入数值生成列表,验证二分法

请输入对应的数字: 2

请输入列表长度: 5

请输入列表第1个值:23

请输入列表第2个值:54

请输入列表第3个值:65

请输入列表第4个值:87

请输入列表第5个值:23

the list is [23, 54, 65, 87, 23]

the mark is 65

The index 3 is 65

python中如何调用函数交换两个变量的值

python中如何调用函数交换两个变量的值 所有代码来在python3.7.1版本实现 以下实例通过用户输入两个变量,并相互交换:  方法一: def swap(a,b): # 创建临时变量,并交换 ...

Python中递归的最大次数

实际应用中遇到了一个python递归调用的问题,报错如下: RuntimeError: maximum recursion depth exceeded while calling a Python ...

python 解决递归调用栈溢出

递归函数 2578次阅读 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 举个例子,我们来计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact ...

Python函数递归调用

函数的递归调用: 是函数嵌套调用的一种特殊形式 具体是指: 在调用一个函数的过程中又直接或间接地调用到了本身 # 直接调用本身 def func(): print('我是func') func() f ...

python 3 递归调用与二分法

递归调用与二分法 1.递归调用 递归调用:在调用一个函数的过程中,直接或间接地调用了函数本身. 示例: def age(n): if n == 1: return 18 # 结束条件 return a ...

064、Java中递归调用

01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

Python中如何调用Linux命令

一.使用os模块 In [1]: import os #导入os模块 In [2]: os.system('ls') anaconda-ks.cfg epel-release-7-5.noarch.r ...

python中子类调用父类的方法

1子类调用父类构造方法 class Animal(object): def __init__(self): print("init Animal class~") def run( ...

原创:解决 python中moviepy调用ffmpeg的错误:subprocess, PermissionError: [WinError 5] 拒绝访问

近期运行一个python程序用到了moviepy.editor.VideoFileClip() moviepy基于ffmpeg,但是并不是pip安装的ffmepg, 执行 import imageio ...

随机推荐

【集合框架】JDK1.8源码分析之Comparable && Comparator(九)

一.前言 在Java集合框架里面,各种集合的操作很大程度上都离不开Comparable和Comparator,虽然它们与集合没有显示的关系,但是它们只有在集合里面的时候才能发挥最大的威力.下面是开始我 ...

javascript事件执行流程分析

我一直想搞清楚事件在DOM中的传播方式,今天经高人指点终于明白一二.首先扒了一张图: 事件捕获过程:当我们点击TEXT时,首先是window->document->body->div ...

python:利用asyncio进行快速抓取

web数据抓取是一个经常在python的讨论中出现的主题.有很多方法可以用来进行web数据抓取,然而其中好像并没有一个最好的办法.有一些如scrapy这样十分成熟的框架,更多的则是像mechanize ...

Web工程师的工具箱 | 酷壳 - CoolShell.cn

Web工程师的工具箱 | 酷壳 - CoolShell.cn Web工程师的工具箱 2012年12月19日 陈皓 发表评论 阅读评论 30,168 人阅读     本文出自Ivan Zuzak 的&l ...

Sublime和Codeblocks支持C++11

Sublime和Codeblocks支持C++11 闲来没事看了一下C++11,比起C++0x多了很多新功能,像auto变量,智能指针等,g++4.7以上版本也提供了对C++11的支持,但是,如何在你 ...

java第一阶段测试

一.选择题(35题 * 2分)1. 下列代码编译和运行的结果是:C public static void main(String[] args) {   String[] elements = { & ...

通俗易懂的分析如何用Python实现一只小爬虫,爬取拉勾网的职位信息

源代码:https://github.com/nnngu/LagouSpider 效果预览 思路 1.首先我们打开拉勾网,并搜索"java",显示出来的职位信息就是我们的目标. 2 ...

Treesoft数据库管理系统使用说明

数据列表页面有以下功能:1.直接新添数据行2.直接双击编辑数据3.勾选复制新增数据4.数据按字段排序5.数据列过滤6.结果结果集过滤7.导出数据等 表结构设计页面有以下功能:1.直接新增.删除字段2. ...

stm32 启动文件 C和汇编交叉嵌入

在嵌入式系统开发中,目前使用的主要编程语言是C和汇编,C++已经有相应的编译器,但是现在使用还是比较少的.在稍大规模的嵌入式软件中,例如含有OS,大部分的代码都是用C编写的,主要是因为C语言的结构比较 ...

Zabbix应用四:Zabbix监控Nginx

利用Zabbix监控Nginx 一.准备nginx监控模版: 1.1.下载nginx监控模版:  点此下载 1.2.导入模版: Zabbix管理页面,选择'配置'->'模版'->'导入': ...

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值