【Python-7】递归

递归

递归算法的三个特性:

  • 求解规模为n的问题转化为一个或多个结构相同规模较小的的问题,然后从这些较小的问题可以构造出大问题的解
  • 递归调用的次数必须是有限的
  • 递归必定有结束条件来终止递归
# 递归
# 阶乘的例子
def factorial(n):
    if n == 1: # 结束条件
        return 1
    else:
        return n * factorial(n - 1)

print(factorial(3))

# 求幂次方
# 求幂次方
def power(x, n):
    if n == 0:
        return 1
    else:
        return x * power(x, n - 1)
    
power(3,2)
# 递归实现二分查找

def search(sequence, number, lower, upper):
    if lower == upper: # 结束条件
        assert number == sequence[upper]
        return upper
    else:
        middle = (lower + upper) // 2
        if number > sequence[middle]:
            return search(sequence, number, middle + 1, upper)
        else:
            return search(sequence, number, lower, middle)

def search_2(sequence, number, lower, upper):
    if lower == upper: # 结束条件
        assert number == sequence[upper]
        return upper
    else:
        middle = (lower + upper) // 2
        if number < sequence[middle]:
            return search(sequence, number, lower, middle-1)
        else:
            return search(sequence, number, middle+1, upper)
# 汉诺塔问题
"""
问题:将A杆上的所有盘子移动到C
n表示盘子个数,from_表示起始杆
buffe表示缓冲杆,to_表示目的杆
"""
def hannoi(n, from_, buffer, to_):
    # 如果只有一个盘子,则直接从A挪到C
    if n == 1:
        print(from_, "-->", to_)
        return

    # 将编号为1~n-1的盘子从A全部挪到缓冲区B
    hannoi(n-1, from_, to_, buffer)
    # 将A杆上最后剩下的编号为n的盘子从A挪到C
    hannoi(1, from_, buffer, to_)
    # 将B杆上留下的n-1个盘子从缓冲区B挪到C
    hannoi(n-1, buffer, from_, to_)
    
hannoi(3,"A", "B", "C")
A --> C
A --> B
C --> B
A --> C
B --> A
B --> C
A --> C
# 递归实现归并排序
def separator_elem(list_):
    if len(list_) == 1:
        return list_

    mid = len(list_) // 2
    left = separator_elem(list_[:mid])
    right = separator_elem(list_[mid:])
    
    return merge(left, right)

def merge(x, y):
    l, r = 0, 0
    tmp = []
    while True:
        if l >= len(x):
            tmp += y[r:]
            break
        elif r >= len(y):
            tmp += x[l:]
            break
        elif x[l] < y[r]:
            tmp.append(x[l])
            l += 1
        else:
            tmp.append(y[r])
            r += 1  
    return tmp
print(separator_elem([2, 4, 2, 5, 1, 9, 0, 45, 4, 5, 99,3, 2]))
[0, 1, 2, 2, 2, 3, 4, 4, 5, 5, 9, 45, 99]
发布了134 篇原创文章 · 获赞 119 · 访问量 31万+

猜你喜欢

转载自blog.csdn.net/jobbofhe/article/details/90032752
今日推荐