C,C++,Python实现汉诺塔递归算法问题

目录

  • 1.题目解释
  • 2.算法思想
  • 3.编程实现
    • 1.Python实现
    • 2.C语言实现
    • 3.C++实现
  • 4.励志语录

1.题目解释

汉诺塔问题是指:一块板上有三根针 A、B、C。A 针上套有 64 个大小不等的圆盘,按照大的在下、小的在上的顺序排列,要把这 64 个圆盘从 A 针移动到 C 针上,每次只能移动一个圆盘,移动过程可以借助 B 针。但在任何时候,任何针上的圆盘都必须保持大盘在下,小盘在上。从键盘输入需移动的圆盘个数,给出移动的过程。
C,C++,Python实现汉诺塔递归算法问题_第1张图片

2.算法思想

对于汉诺塔问题,当只移动一个圆盘时,直接将圆盘从 A 针移动到 C 针。若移动的圆盘为 n(n>1),则分成几步走:把 (n-1) 个圆盘从 A 针移动到 B 针(借助 C 针);A 针上的最后一个圆盘移动到 C 针;B 针上的 (n-1) 个圆盘移动到 C 针(借助 A 针)。每做一遍,移动的圆盘少一个,逐次递减,最后当 n 为 1 时,完成整个移动过程。

因此,解决汉诺塔问题可设计一个递归函数,利用递归实现圆盘的整个移动过程,问题的解决过程是对实际操作的模拟。
C,C++,Python实现汉诺塔递归算法问题_第2张图片

3.编程实现

1.Python实现

#鹏鹏写代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 将n个盘子借助y柱从x柱移动到z柱
def hanoi(n, x, y, z):

  count = 0
  if n == 1: # 递归出口
   print(x, ' --> ', z)
   return 1
  else:
   # 将前n - 1个盘子借助z柱从x柱移动到y柱上
   count += hanoi(n - 1, x, z, y) # 递归调用

   # 将最底下的1个盘子从x柱移动到z柱上
   count += hanoi(1, x, y, z)

   # 将n - 1个盘子借助x柱从y柱移动到z柱上
   count += hanoi(n - 1, y, x, z) # 递归调用

   return count


def main():

  hanoi_level = input("请输入汉诺塔层数:")
  print("总共移动次数为%d" % hanoi(int(hanoi_level), 'X', 'Y', 'Z'))


if __name__ == '__main__':
  main()

C,C++,Python实现汉诺塔递归算法问题_第3张图片

2.C语言实现

#include 
int main()
{
     
    int hanoi(int,char,char,char);
    int n,counter;
    printf("Input the number of diskes:");
    scanf("%d",&n);
    printf("\n");
    counter=hanoi(n,'A','B','C');
    return 0;
}

int hanoi(int n,char x,char y,char z)
{
     
    int move(char,int,char);
    if(n==1)
        move(x,1,z);
    else
    {
     
        hanoi(n-1,x,z,y);
        move(x,n,z);
        hanoi(n-1,y,x,z);
    }
    return 0;
}

int move(char getone,int n,char putone)
{
     
    static int k=1;
    printf("%2d:%3d # %c--->%c\n",k,n,getone,putone);
    if(k++%3==0)
        printf("\n");
    return 0;
}

运行结果:
C,C++,Python实现汉诺塔递归算法问题_第4张图片

3.C++实现

#include 
using namespace std; 
int main()
{
     
    int hanoi(int,char,char,char);
    int n,counter;
    cout<<"Input the number of diskes:"<<endl;
    cin>>n;
    cout<<"\n";
    counter=hanoi(n,'A','B','C');
    return 0;
}

int hanoi(int n,char x,char y,char z)
{
     
    int move(char,int,char);
    if(n==1)
        move(x,1,z);
    else
    {
     
        hanoi(n-1,x,z,y);
        move(x,n,z);
        hanoi(n-1,y,x,z);
    }
    return 0;
}

int move(char getone,int n,char putone)
{
     
    static int k=1;
    cout<<k<<":  "<<n<<"#  "<<getone<<"---->"<<putone<<endl;
    
    if(k++%3==0)
        printf("\n");
    return 0;
}

运行结果:
C,C++,Python实现汉诺塔递归算法问题_第5张图片
C,C++,Python实现汉诺塔递归算法问题_第6张图片

4.励志语录

  1. 错过了太阳就不要错过了月亮,错过了月亮就会连星星都错过。
  2. 当懒散成为你的一种习惯的时候,很难再拿出奋斗的勇气。

你可能感兴趣的:(C++案例,C语言案例,python语言案例,python,c++,c语言,算法)