递归算法与汉诺塔

递归算法与汉诺塔

递归算法(英语:recursion algorithm)在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。递归算法是一种直接或者间接调用自身函数或者方法的算法。

运用递归的条件:每一步进行的操作基本相同,并且问题规模逐渐减小。

递归的过程

递归,顾名思义,其包含了两个意思:递 和 归,这正是递归思想的精华所在。递归就是有去(递去)有回(归来),用递归求4!如下图所示:

 

用递归求阶乘的python代码

def fun(n):

    if n == 0 or n == 1:

        return 1

    else:

        return (n * fun(n - 1))

 

num = int(input("请输入一个数字: "))

a = fun(num)

print(a)

 

经典递归问题

汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。此问题等价于:

设a,b,c是3个柱子。开始时,在柱子a上有一叠共n个圆盘,这些圆盘自下而上,由大到小地叠在一起。各圆盘从小到大编号为1,2,…,n,现要求将柱子a上的圆盘移到柱子c上,在移动圆盘时可以借助b柱子,但应遵守以下移动规则:

规则1:每次只能移动1个圆盘;

规则2:任何时刻都不允许将较大的圆盘压在较小的圆盘之上;

规则3:在满足移动规则1和2的前提下,可将圆盘移至a,b,c中任一柱子上。

 

 

目标:把a柱子上的n个盘子移动到c柱子

递归的思想就是把这个目标分解成三个子目标

子目标1:将前n-1个盘子从a移动到b上

子目标2:将最底下的最后一个盘子从a移动到c上

子目标3:将b上的n-1个盘子移动到c上

然后每个子目标又是一次独立的汉诺塔游戏,也就可以继续分解目标直到N为1

 

用递归求汉诺塔的python代码

def hanoi(n, a, b, c):

    if n == 1:

        print(a, '-->', c)

    else:

        hanoi(n - 1, a, c, b)

        hanoi(1    , a, b, c)

        hanoi(n - 1, b, a, c)

# 调用

n = int(input("请输入汉诺塔的层数并回车:\n"))

hanoi(n, 'A', 'B', 'C')

 

附录、

Python实现汉诺塔问题的可视化(以动画的形式展示移动过程)

https://www.cnblogs.com/ReganWhite/p/10595719.html

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章