这是一个经典的问题,递归程序实现,子程序中两次调用自己。
也是递归调用程序中的范例。
递归程序的关键在于递归调用和结束条件,通常十分简洁明了。
程序中,使用条件编译来统计子程序调用次数。
/* * * 汉诺塔问题算法程序 * */ #include <stdio.h> //#define DEBUG #ifdef DEBUG int c1=0; #endif void hanoi(int, char, char, char); void move(int, char, char); int main(void) { int i; for(i=1; i<=4; i++) { printf("\nlevel=%d:\n", i); #ifdef DEBUG c1 = 0; #endif hanoi(i, 'A', 'B', 'C'); #ifdef DEBUG printf("c1=%d\n", c1); #endif } return 0; } void hanoi(int n, char from, char to, char temp) { #ifdef DEBUG c1++; #endif if(n == 1) { move(n, from, to); } else { hanoi(n-1, from, temp, to); move(n, from, to); hanoi(n-1, temp, to, from); } } void move(int n, char from, char to) { printf("%d: %c->%c\n",n, from, to); }