python-递归

前言:
递归是计算机科学里出现非常多的一个概念,有时候用递归解决问题看起来非常简单优雅。推荐看看《算法图解》第三章递归,举的例子比较浅显易懂

什么是递归?

递归用一种通俗的话来说就是自己调用自己,但是需要分解它的参数,
让它解决一个更小一点的问题,当问题小到一定规模的时候,
需要一个递归出口返回。
这里举一个和其他很多老套的教科书一样喜欢举的例子,阶乘函数,
阶乘函数,我觉得用它来演示再直观不过。他的定义是这样的:

这里写图片描述

我们很容易根据它的定义写出这样一个递归函数,因为它本身就是递归定义的。

这里写图片描述


1.递归必须包含一个基本的出口(base case),
  否则就会无限递归,最终导致栈溢出。
  比如这里就是n==0返回1

2.递归必须包含一个可以分解的问题(recursive case).
  要想求得fact(n),就需要用 n*fact(n-1)

3.递归必须要向着递归出口靠近(toward the base case).
  这里每次递归调用都会n-1,向着递归出口n==0靠近


调用栈这里写图片描述

栈实现递归原理图
这里写图片描述


普通递归&尾递归

这里写图片描述


实例代码块

# -*- coding:utf-8 -*-

from collections import deque

def fact(n):
    if n == 0:
        return 1
    else:
        return n*fact(n-1)

def print_run_recursive(n):
    if n>0:
        print_run_recursive(n-1)
        print(n)

class Stack(object):
    def __init__(self):
        self._deque = deque()

    def push(self,value):
        return self._deque.append(value)

    def pop(self):
        return self._deque.pop()

    def is_empty(self):
        return len(self._deque) == 0

def print_run_use_stack(n):
    s = Stack()
    while n>0:
        s.push(n)
        n-=1

    while not s.is_empty():
        print(s.pop())


print_run_use_stack(10)

'''
    输出结果:
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
'''




汉诺塔问题

这里写图片描述

我们把它转换成代码



def haoni_move(n,source,dest,intermediate):
    if n >= 1:
        haoni_move(n-1,source,intermediate,dest)
        print("Move %s --> %s" % (source,dest))
        haoni_move(n-1,intermediate,dest,source)
    haoni_move(3,'A','C','B')

#输出,建议你手动模拟一下,三个盘子 A(source),B(intermediate),
#C(Destination)

'''
    Move A --> C
    Move A --> B
    Move C --> B
    Move A --> C
    Move B --> A
    Move B --> C
    Move A --> C

'''

猜你喜欢

转载自blog.csdn.net/qq_39469688/article/details/81502272