数据结构08-递归及其应用(汉诺塔问题)

累加的递归实现

int addTo(int pN){
	if(pN <= 0){
		return 0;
	}else {
		return addTo(pN-1) + pN;
	}
}

测试函数

void addToTest(){
	int n,sum;
	printf("---- addToTest begins. ----\r\n");
	
	n = 5;
	sum = addTo(n);
    printf("\r\n0 adds to %d gets %d.\r\n", n, sum);

	n = 1;
	sum = addTo(n);
    printf("\r\n0 adds to %d gets %d.\r\n", n, sum);

	n = -1;
	sum = addTo(n);
    printf("\r\n0 adds to %d gets %d.\r\n", n, sum);


    printf("---- addToTest ends. ----\n\n");

}

汉诺塔

void hanoi(int pN,char pSource,char pDestination,char pTransit){
	if(pN <= 0){
		return;
	}else{
		hanoi(pN - 1,pSource,pTransit,pDestination);
		printf("%c -> %c \n",pSource,pDestination);
		hanoi(pN - 1,pTransit,pDestination,pSource);
	}
}

主函数

int main(){
	addToTest();
	
	int n;
	char a = 'A';
	char b = 'B';
	char c = 'C';
	
	printf("Please input the number of palates.\n") ;
	scanf("%d",&n);
	
	hanoi(n,'A','B','C');
	return 0;
}

完整代码

#include<stdio.h>

int addTo(int pN){
	if(pN <= 0){
		return 0;
	}else {
		return addTo(pN-1) + pN;
	}
}

void addToTest(){
	int n,sum;
	printf("---- addToTest begins. ----\r\n");
	
	n = 5;
	sum = addTo(n);
    printf("\r\n0 adds to %d gets %d.\r\n", n, sum);

	n = 1;
	sum = addTo(n);
    printf("\r\n0 adds to %d gets %d.\r\n", n, sum);

	n = -1;
	sum = addTo(n);
    printf("\r\n0 adds to %d gets %d.\r\n", n, sum);


    printf("---- addToTest ends. ----\n\n");

}

void hanoi(int pN,char pSource,char pDestination,char pTransit){
	if(pN <= 0){
		return;
	}else{
		hanoi(pN - 1,pSource,pTransit,pDestination);
		printf("%c -> %c \n",pSource,pDestination);
		hanoi(pN - 1,pTransit,pDestination,pSource);
	}
}

int main(){
	addToTest();
	
	int n;
	char a = 'A';
	char b = 'B';
	char c = 'C';
	
	printf("Please input the number of palates.\n") ;
	scanf("%d",&n);
	
	hanoi(n,'A','B','C');
	return 0;
}

运行结果

---- addToTest begins. ----

0 adds to 5 gets 15.

0 adds to 1 gets 1.

0 adds to -1 gets 0.
---- addToTest ends. ----

Please input the number of palates.
3
A -> B
A -> C
B -> C
A -> B
C -> A
C -> B
A -> B

总结

         正如老师所说,汉诺塔问题是智商的分水岭,它的代码不长,但是理解要花不少时间。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值