经典递归题目:汉诺塔

汉诺塔是一个非常经典的递归问题。

解决这种递归问题,从最简单的情况开始着手。

设现在有三个位置,分别是起始位置,过渡位置,目标位置。

假设 n = 1,那么直接一步就可以了。 

n = 2 时,我们需要把起始位置上面的小的一块先放到 过渡位置,然后把大的一块放到目标位置。再把小的放到大的上去。

n = 3 时,........

可以看到,要想把起始位的最大块放大目标位,必须把它前 n-1 块放到过渡位置上,然后把最大块移动到目标位,再把n-1块移动到目标位,完成。

f(n) 代表把n块从一个位置移动到另一个位置上所需要操作的次数。

n过程次数
111
21+1+13
33+1+37
47+1+715

.....

...........
n-1f(n-2)+1+f(n-2)f(n-1)
nf(n-1)+1+f(n-1)f(n) = 2*f(n-1)+1

 

 

 

 

 

 

 

 

 

程序如下。

其中参数部分,n 代表需要移动的块数, a 代表起始位置,b 代表过渡位置,c 代表目标位置。

//输出移动过程

hanoi( int n, char a, char b, char c){
    if(n ==1 )//结束条件
        printf("%c --> %c", a, c);
    else{ //递归体
        hanoi(n-1, a, c, b);
        printf("%c --> %c", a, c);
        hanoi(n-1, b, a, c);
    }
}


hanoi( 5 , 'A', 'B', 'C');


//计算移动次数
hanoi( int n, char a, char b, char c){
    if(n ==1 )//结束条件
        return 1;
    else{ //递归体
        return 2*hanoi(n-1, a, c, b) + 1;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值