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

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中递归调用的更多相关文章

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

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

  2. Python中递归的最大次数

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

  3. python 解决递归调用栈溢出

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

  4. Python函数递归调用

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

  5. python 3 递归调用与二分法

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

  6. 064、Java中递归调用

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

  7. Python中如何调用Linux命令

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

  8. python中子类调用父类的方法

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

  9. Python中模块调用说明

    1 import test # 导入test模块 2 3 print(test.a) # 使用"模块.变量"调用模块中的变量 4 5 test.hi() # 使用"模块. ...

随机推荐

  1. Linux--抓取Appium网站命令

    # 获取各命令url地址 curl http://appium.io/docs/en/commands/device/app/is-app-installed/ 2>/dev/null | gr ...

  2. POJ-1414 Life Line (暴力搜索)

    Life Line Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 855 Accepted: 623 Description L ...

  3. Freemarker 基本数据类型

    一 数据类型简介 freemarker 模板中的数据类型由如下几种: 1. 布尔型:等价于java中的boolean类型, 不同的是不能直接输出,可以转换成字符串再输出 2. 日期型:等价于java中 ...

  4. 2018牛客网暑期ACM多校训练营(第三场) H - Shuffle Cards - [splay伸展树][区间移动][区间反转]

    题目链接:https://www.nowcoder.com/acm/contest/141/C 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K ...

  5. 2018/04/17 每日一个Linux命令 之 tar

    10天没有更新这个每日学习 linux 了,因为实在很忙,晚上还要看会其他知识. 但是也不应该给自己找理由,还是应该每天的坚持下去 -- tar 用于在 linux 解压缩/文件 这个命令下面的参数非 ...

  6. 2018/03/16 每日一个Linux命令 之 rm

    最痛快的指令,没有之一. 一次永久删除,恢复很麻烦. 我会告诉你我第一次上服务器的时候删除了项目代码?(还好我提前备份了一下) -- rm [-参数][文件或者文件夹/支持正则通配] 参数: -i 删 ...

  7. 看病要排队--hdu1873

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1873 运用优先队列写就行了 #include<stdio.h> #include< ...

  8. Animator Override Controller学习及性能测试

    本文由博主(YinaPan)原创,转载请注明出处: http://www.cnblogs.com/xsln/p/Animator_Override_Controller.html 一.Animator ...

  9. android(七)Looper Handler分析

    一.总结 Looper有一个MessageQueue,用于封装消息循环.   Handler封装了消息投递,消息处理等的辅助类 二.分析 1.从Looper的用法开始分析 class LooperTh ...

  10. SSH进行登录远程主机,实验室网站,项目

    1:下载putty,双击putty.exe     http://www.putty.be/latest.html 输入要连接的ip和端口号,直接打开open.或者在saved Sessions框里面 ...