递归函数以及函数名即变量

函数名即变量

定义函数时,函数名其实就是变量,指向函数。

def foo():
    print('from foo')
    bar()
def bar():
    print('from bar')
foo()
虽然函数foo中包含了未在foo之前未定义的函数bar,但是在调用函数foo()前已定义bar函数,在调用时会指向bar()函数,可以正常运行,结果为
from foo
from bar
但是在bar函数前调用foo(),则程序会报错
def foo():
    print('from foo')
    bar()
foo()
def bar():
    print('from bar')
运行报错
NameError: name 'bar' is not defined

令f=abs则可以让f指向abs函数内部,f具有和abs()一样的作用.函数名即变量

f=abs
print(f(-3))
结果为3

递归函数

函数return回原函数

person_list=['A','B','C',"D"]
def ask_way(person_list):
    print('-'*50)
    if len(person_list)==0:
        return ('Nobody konws the way')
    person=person_list.pop(0)
    if person=='D':
        return 'I(%s) know the way'%person
    print('Excuse me,%s Do you know the way'%person)
    print('Sorry,I(%s) don\'t know ,I will ask %s '%(person,person_list))
    res=ask_way(person_list)
    print('The result of %s is %s'%(person,res))
    return res
res=ask_way(person_list)
print(res)
结果为
--------------------------------------------------
Excuse me,A Do you know the way
Sorry,I(A) don't know ,I will ask ['B', 'C', 'D'] 
--------------------------------------------------
Excuse me,B Do you know the way
Sorry,I(B) don't know ,I will ask ['C', 'D'] 
--------------------------------------------------
Excuse me,C Do you know the way
Sorry,I(C) don't know ,I will ask ['D'] 
--------------------------------------------------
The result of C is I(D) know the way
The result of B is I(D) know the way
The result of A is I(D) know the way
I(D) know the way

解析:

当问A时,A不知道,然后A继续问下一个进行递归,因为没有return返回值,故res下的print不会执行.直到问到D,出现返回值

I(D) know the way

D将返回值抛给C,故C得到返回值,执行print,然后C再将返回值抛给B,B再执行print,直到A,执行print后,return得到的返回值.

过程为

A --> B --> C --> D(得到return)返回 --> C --> B -->A --> return

再例如求阶乘函数

def f(n):
    if n==1:
        return 1
    return n*f(n-1)
print(f(5))
结果为120

过程为

f(5) --> 5f(4) --> 4f(3) --> 3f(2) --> 2f(1)返回 --> 2*1 --> 3*2*1 --> 4*3*2*1 --> 5*4*3*2*1=120

递归函数必须要有终止条件,否则会无限循环

递归函数效率不高,过长的递归会发生栈溢出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值