| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
最近学到递归,汉诺塔的递归,看了好久,但是总感觉有层纸没有捅破,虽然程序写出来了,但是是照着课本写出来的,要是自己想,不看答案的话,完全写不出来。那位大神有理解汉诺塔递归的通俗易懂的解释,代码也放上来,给更不明白的,有个视觉的理解。 
 
#include <stdlib.h> 
#include <stdio.h> 
#include <windows.h> 
 
int plate[100][3]={{0},{0,0,0},{0,0,0}}; 
int a=0,b=1,c=2,position[100]={0}; 
int numbers,count=0,time=10; 
 
void main() 
 
{ 
 
        int move(int,int,int); 
        int hanoi(int,int,int,int); 
        int i,j; 
 
 
 
 
 
 
 
        printf("请输入汉诺塔的层数:"); 
        scanf("%d",&numbers); 
        printf("\n请输入下一步的间隔时间(毫秒):"); 
        scanf("%d",&time); 
        printf("\n"); 
 
 
        for(j=0;j<numbers;j++) 
        { 
 
                plate[j][a]=j+1; 
                position[j+1]=j; 
 
        } 
 
 
 
 
 
        printf("您输入的汉诺塔如下:\n"); 
        for(j=0;j<numbers;j++) 
        { 
 
                for(i=0;i<=2;i++)printf("%10d",plate[j][i]); 
                printf("\n"); 
        } 
 
        printf("按回车键继续\n"); 
        getchar(); 
        getchar(); 
 
 
 
 
        hanoi(numbers,a,b,c); 
        printf("演示完成回车键退出\n"); 
        getchar(); 
        getchar(); 
 
 
} 
 
int move(int m,int x,int y) 
{ 
 
        int i=0,j=0,p=0; 
         
        p=position[m]; 
        for(j=numbers-1;j>=0;j--) 
        { 
                if(plate[j][y]==0) 
                { 
 
                        plate[j][y]=plate[p][x]; 
            position[m]=j; 
                        plate[p][x]=0; 
                         
 
                        break; 
                } 
                else continue; 
 
        } 
 
 
 
        system("cls"); 
        printf("\n"); 
        for(j=0;j<numbers;j++) 
        { 
        for(i=0;i<=2;i++)printf("%10d",plate[j][i]); 
        printf("\n"); 
        } 
        Sleep(time); 
 
 
 
}         
 
 
int hanoi(int n,int x,int y,int z) 
{ 
 
        int move(int m,int x,int y); 
        if (n==1) 
        { 
                count++; 
                 
                //printf("第%d个,%c%c%c,%d次",n,x+65,y+65,z+65,count); 
                //printf("plate[%d][%d]%d,",n-1,x,plate[n-1][x]); 
                //printf("%c-->%c\n",x+65,z+65); 
                move(n,x,z); 
                 
        } 
        else 
        { 
                hanoi(n-1,x,z,y); 
                count++; 
                //printf("第%d个,%c%c%c,%d次",n,x+65,y+65,z+65,count); 
                //printf("plate[%d][%d]%d,",n-1,x,plate[n-1][x]); 
                //printf("%c-->%c\n",x+65,z+65); 
                move(n,x,z); 
                 
 
                hanoi(n-1,y,x,z); 
 
        } 
 
 
 
 
 
} 
 
 
 |   
 
 
 
 |