汉诺塔及递归
汉诺塔的编程解决算法:递归实现。什么是递归?
程序调用自身的编程技巧称为递归( recursion),例如:
void fun()
{
fun();
}
递归在计算机中是怎么运行的,次序是怎样的?,如:
int main(void)
{
fun();
}
递归,函数自己调用自己
递归函数要有返回的条件,就是不要一直循环下去。
int fun(int n)
{
if(n>0)
{
return n+fun(n-1);
}
else
{
return 0;
}
}
int main(void)
{
int sum = 0;
sum = fun(10);
printf("sum = : %d",sum);
}
int fun(int n)
{
if(n>0)
{
n = n+fun(n-1);
return n;
}
else
{
return 0;
}
}
3.汉诺塔编程算法
#include<stdio.h>
#include<stdlib.h>
static int count = 0;
void move(char getone, char putone) {
count ++;
printf("%c-->%c\n", getone, putone);
}
void hanoit(int n, char a, char b, char c) {
if(n == 1)
{
move(a, c);
}
else
{
hanoit(n - 1, a, c, b);
printf(“count :%d\n”,count);
move(a, c);
hanoit(n - 1, b, a, c);
}
}
int main() {
int m;
scanf("%d", &m);
hanoit(m, 'A', 'B', 'C');
printf("count :%d",count);
system("pause");
return 0;
}
上图中,有三根棒,左中右,分别命名为’A’,‘B’,‘C’,移动‘A’棒的圆片到‘B’棒上,代码执行为:move(‘A’,‘B’)
依次类推:如吧’C’棒移动到‘A’棒,为move(‘C’,‘A’)。
先从简单的开始,假设有三个圆片,最初从小到大放在A棒,移动之后,要从小到大依次放在C棒,圆片根据小到大命名:1,2,3
第一步,将1从A棒移动到C棒
第二步,将2从A棒移动到B棒
第三步,将1从C棒移动到B棒
第四步,将3从A棒移动到C棒
第五步,将1从B棒移动到A棒
第六步,将2从B棒移动到C棒
第七步,将1从A棒移动到C棒
此时,圆盘1,2,3按从小到大依次排列依次在C棒上,移动的过程中没有违背规则:不管在哪根棒上,小片必须在大片上面
void hanoit(int n, char a, char b, char c) {
if(n == 1)
{
move(a, c);
}
else
{
hanoit(n - 1, a, c, b);
printf(“count :%d\n”,count);
move(a, c);
hanoit(n - 1, b, a, c);
}
}
函数
void hanoit(int n, char a, char b, char c) {
if(n == 1)
{
move(a, c);
}
else
{
hanoit(n - 1, a, c, b);
printf(“count :%d\n”,count);
move(a, c);
hanoit(n - 1, b, a, c);
}
}
程序调用自身的编程技巧称为递归( recursion),例如:
void fun()
{
fun();
}