Python学习---递归函数的学习

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

递归特性:

1. 必须有一个明确的结束条件

2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少

3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返     回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。)

实例1:  (阶乘)

# 普通方法
def factorial(num):
    fac = num
    for i in range(1, num):
        fac *= i
    return fac
print(factorial(4))

# 递归实现
def factorial(num):
   if num == 1:                     # 结束条件
        return 1
   return factorial(num - 1) * num
print(factorial(4))


# 函数式编程实现:
from functools import reduce
print (reduce(lambda x,y: x*y, range(1,5)))  # 24

实例2:斐波那契数列

# 普通实现:
# 0 1 1 2 3 5 8 13
def fibo(n):
    before = 0
    after = 1
    ret = 0
    for i in range(n - 1):
        ret = before + after
        before = after
        after = ret
    return ret
print(fibo(6))                 # 8

# 递归实现:
# 0 1 1 2 3 5 8 13
def fibo_new(n):  # n可以为零,数列有[0]
    if n <= 1:            # 结束条件   f(0)=0,f(1)=1,f(2)=f(1)+f(0)-->符合return条件,所以<=1
        return n
    return (fibo_new(n - 1) + fibo_new(n - 2))   # f(8) = f(7) + f(6)
print(fibo_new(6))                  #  8

# 其他实现
def fib(max):
    n, b, a = 0, 0, 1
    while n < max:
        print(b)
        b, a = a, b+a  # 赋值是同时执行的
        n += 1
fib(6)   # 8

 

实例3:求number =[2, -5, 9, -7, 2, 5, 4, -1, 0, -3, 8]中的正数的平均值

# 递归实现
number = [2, -5, 9, -7, 2, 5, 4, -1, 0, -3, 8]
count = 0
li = []
for i in range(len(number)):
    if number[i] > 0:
        li.append(number[i])
        count += 1
count = str(count)
print("%s个正整数的和为%d" % (count, sum(li)))
# 函数式编程

# 待写

posted @ 2018-07-28 17:07  小a玖拾柒  阅读(263)  评论(0编辑  收藏  举报