常见递归问题

2018-02-20  本文已影响7人  马小跳_

1.小鲤鱼

def xiaoliyu(n):
    if n == 0:
        print("我的小鲤鱼", end="")
    else:
        print("抱着", end="")
        xiaoliyu(n-1)
        print("的我", end="")
xiaoliyu(5)  # 抱着抱着抱着抱着抱着我的小鲤鱼的我的我的我的我的我

2.汉诺塔

问题分解:

n个盘子时:
    1.把n-1个圆盘从A经过C移动到B
    2.把第n个圆盘从A移动到C
    3.把n-1个小圆盘从B经过A移动到C
def hanoi(n, A, B, C):
   if n > 0:
       hanoi(n-1, A, C, B)
       print("%s -> %s"%(A, C))
       hanoi(n-1, B, A, C)
hanoi(3, 'A', 'B', 'C')

3.斐波那契数列

斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34....

这个数列从第3项开始,每一项都等于前两项之和。

def fibo(n):
    if n <= 2:
        return n
    else:
        return fibo(n-1)+fibo(n-2)
print(fibo(5))

4.二分查找

从有序列表的候选区data[0:n]开始,通过对待查找的值与候选区中间值的比较,可以使候选区减少一半。

def binarySearch(li, val, low, high):
    low = 0
    high = len(li) - 1
    while low <= high:
        mid = (low+high) // 2
        if li[mid] > val:
            high = mid - 1
        elif li[mid] < val:
            low = mid + 1
        else:
            return mid
    else:
        return -1

递归版本的二分查找

def binarySearch_rec(li, val, low, high):
    while low <= high:
        mid = (low+high) // 2
        if li[mid] == val:
            return mid
        elif li[mid] > val:
            return binarySearch(li, val, low, mid-1)
        else:
            return binarySearch(li, val, mid+1, high)
上一篇下一篇

猜你喜欢

热点阅读