当前位置:
文档之家› 源代码--数据结构与算法(Python版)chap5 函数
源代码--数据结构与算法(Python版)chap5 函数
2. 设计递归出口:根据规模最小的子问题确定递归 终止条件,例:求解n! ,当n=0时,n!=1;
22
第8章 函数与模块
例:汉诺塔问题。设有三座塔座(A、B、C),在一 个塔座(设为A)上有64个盘片,盘片不等,按大盘 在下,小盘在上的顺序依次叠放。现要将A塔上的盘 片借助于B塔,移到C塔上并保持同样顺序叠排,移 动盘片时必须遵守以下规则:
def age(int n): 递归结
if n==1:
束条件
c=10
else:
c=age(n-1) + 2
return c
n=int(input(“input n:”)) print(“%d”%age(n))
age(5) =age(4)+2
age(4) =age(3)+2
age(5) =18
age(4) =16
算法用函数hanoi(n,x,y,z)以递归算法实现
盘片数 源塔 借用塔 目标塔
递归终止:当递归调用到盘片数为1时
算法描述: 1)递归调用hanoi(n-1,a,c,b) 2)将n号盘片从a塔移动到c塔 3)递归调用hanoi(n-1,b,a,c)
25
count=0 def hanoi(n,x,y,z):
17
第8章 函数与模块
总结
执行过程(两个阶段) 第一阶段:逐层调用,调用函数自身 第二阶段:逐层返回,返回到调用该层的位 置
递归调用是多重嵌套调用的一种特殊情况 调用的深度:调用的层数
18
第8章 函数与模块
Hale Waihona Puke 例:有5个人,第5个人说他的年龄比第第4个人大2岁, 第4个人说他的年龄比第3个人大2岁,第3个人说他的 年龄比第2个人大2岁,第2个人说他的年龄比第1个人 大2岁;第一个人说他是10岁。请问第5个人多大?
x_list=[3,5] swap(x_list) print("x_list[0]=",x_list[0],"x_list[1]=",x_list[1])
运行结果: a_list[0]= 5 a_list[1]= 3 x_list[0]= 5 x_list[1]= 3
11
函数的返回值
第8章 函数de与f模ad块d(a,b): c=a+b
14
第8章 函数与模块
函数的递归调用
在函数de的f f(执x):行过程中又de直f a接(x):或间接调用d该ef 函b(t)数: 本身
……
……
……
直接递z归=f(y调) 用
z=b(y)
m=a(x)
在函数r…et中u…rn.直(2接*z)调用函数本r…et身u…rn. (2*z)
……. return(3+c)
swap(x, y) print("x=",x,"y=",y)
运行结果: input x,y:3,5 a= 5 b= 3 x= 3 y= 5
10
第8章 函数与模块
例: 传地址方式。
def swap(a_list): a_list[0],a_list[1]=a_list[1],a_list[0] print("a_list[0]=",a_list[0],"a_list[1]=",a_list[1])
参数
说明
ave=average(a,b,c) print("average=%f"%ave)
实参可以是常量、变量和表达式,但必须在函数
调用之间有确定的值。
形参与实参个数相同
形参定义时编译系统并不为其分配存储空间,也无 初值;只有在函数调用时,临时分配存储空间,接 受来自实参的值;函数调用结束,内存空间释放。
a,b,c=eval(input("please input a 、b、c:")) ave=average(a,b,c) print("average=%f"%ave)
def printstar(): print("*************")
def print_message(): print("How are you!")
def getMax(a,b,c): if a>b: max=a else: max =b if(c>m): max =c return max
在Python中不 允许前向引用, 即在函数定义 之前,不允许 调用该函数。
a,b,c=eval(input("input a,b,c:")) n= getMax (a,b,c) print("max=",n)
指函数被调用、执行完后,返回给主调函数的值。
x=add(3,20)
函数的返回语句
print(x)
一般形式 return 表达式
功能: 使程序控制从被调用函数返回到调用函数中, 同时把返回值带给调用函数
说明
❖ 函数内可有多条返回语句。
❖ 如果没有return语句,会自动返回NONE;如果有return 语句,但是return后面没有表达式也返回NONE。
5
函数的调用
第8章 函数与模块
一般形式: 函数名([实际参数表])
说明
❖ 实参可以是常量、变量、表达式、函数等,但在
进行函数调用时必须有确定的值。
❖ 函数的实参和形参应在个数、类型和顺序上 一 一对应。
❖ 对于无参函数,调用时实参表列为空,但( )不能 省。
6
第8章 函数与模块
例:编写函数,求3个数中的最大值。
def main(): printstar() print_message() printstar()
main()
4
第8章 函数与模块
函数的定义与调用
定义一般形式:
def 函数名([形式参数表]):
函数
函数体
定义
时要
[return 表达式]
注意
采用def 关键字定义函数,不需要指定返回值的类型; 函数的参数不限,不需要指定参数类型; 参数括号后面的冒号“:”必不可少; 函数体相对于def关键字必须保持一定的空格缩进; return语句是可选的; 允许定义函数体为空的函数。
print("%d不是素数"%m)
13
第8章 函数与模块
例:求一个数列中的最大值和最小值。
def getMaxMin( x ):
max = x[0]
min = x[0]
for i in range( 0, len(x)):
if max<x[i]: max = x[i]
if min>x[i]: min = x[i]
思路:建立函数求个人的年龄,以每人的序号为 参数,根据题意可知:
age(5)=age(4)+2 age(4)=age(3)+2
age(3)=age(2)+2 age(2)=age(1)+2
age(1)=10; 即 age(n)=
10 age(n-1)+2
(n=1) (n>1)
19
第8章 函数与模块
16
第8章 函数与模块
例 求递归方法求n的阶乘
n!
1 n
(n
1)!
(n 0,1) (n 1)
递推归纳: n! (n 1)! (n 2)! ... 2!1!
递归终止: n 0时,0!1
def fac(n): if n==0: f=1 else: f=fac(n-1)*n; return f
n=int(input("please input n: ")) f=fac(n) print("%d!=%d"%(n,f))
在程序前导入该函数原型所在的模块
使用库函数应注意: 1、函数功能 2、函数参数的数目和顺序,及各参数意义和类型 3、函数返回值意义和类型
❖用户自定义函数
3
函数分类
第8章 函数与模块
2. 从参数传递的角度 有参函数
无参函数
def average(x,y,z): aver=(x+y+z)/3; return(aver)
给形参
9
第8章 函数与模块
例如: 编一程序,将主函数中的两个变量的值传递 给swap函数中的两个形参,交换两个形参的值。
def swap(a, b): a,b=b,a
形式参数(形参)
print("a=",a,"b=",b)
实际参数(实参) x,y=eval(input("单in向pu值t x传,y递:"))
return (max,min)
string = "Hello" x,y = getMaxMin( string ) print( "string=", string) print( "最大元素=",x, "最小元素=", y)
a_list = [-1,28,-15,5, 10 ] #测试数据为列表类型 x,y = getMaxMin( a_list ) print( "a_list=", a_list) print( "最大元素=",x, "最小元素=", y)
12
第8章 函数与模块
例:编写函数,判断一个数是否是素数。
def isprime(n): for i in range(2,n): if(n%i==0): return 0 return 1
m=int(input("请输入一个整数:")) flag=isprime(m) if(flag==1):