累加的递归实现及汉诺塔问题

1、累加的递归实现

递归算法解决问题的特点:
1)递归就是方法里调用自身。
2)在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。
3)递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。
4)在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等,所以一般不提倡用递归算法设计程序。

代码:

#include<stdio.h>

int Add(int n){
	int sum;
	if(n <= 0)
	{
		printf("return 0\n");
		return 0;
	}
	else
	{
		sum = Add(n-1)+n;
		printf("return %d\n",sum);
		return sum;
	}
}

void AddTest(){
	int n, sum;
    printf("---- AddTest begins. ----\n");

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

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

    printf("---- AddTest ends. ----\n");
}

int main(){
	AddTest();
	return 0;
}

运行结果:

---- AddTest begins. ----
return 0
return 1
return 3
return 6
return 10
return 15

0 adds to 5 gets 15.

return 0
return 1

0 adds to 1 gets 1.

return 0

0 adds to -1 gets 0.

return 0
return 1
return 3
return 6
return 10
return 15
return 21
return 28
return 36
return 45
return 55
return 66
return 78
return 91
return 105
return 120

0 adds to 15 gets 120.

---- AddTest ends. ----



2、汉诺塔问题

汉诺塔问题简述:有三根柱子,编号分别为A,B,C,A柱子自下而上、由大到小按顺序放置n个圆盘,实现将A柱上的圆盘全部移到C柱上,并仍保持原有顺序叠好。移动规则:每次只能移动一个圆盘,并且在移动过程中三根柱上都始终保持大盘在下,小盘在上,移动过程中圆盘可以置于A,B,C任一根柱子上。

解题思想:
(1)以C柱为中介,先将n-1个圆盘按规则从A柱移动到B柱上;
(2)将最底层的圆盘移动到C柱上;
(3)以A柱为中介,将B柱上的n-1个圆盘按规则移动到C柱上。

代码:

#include <stdio.h>

void hanoi(int paraN, char paraSource, char paraDestination, char paraTransit) {
	if (paraN <= 0)
	{
		return;
	} 
	else
	{
		hanoi(paraN - 1, paraSource, paraTransit, paraDestination);
		printf("%c -> %c \n", paraSource, paraDestination);
		hanoi(paraN - 1, paraTransit, paraDestination, paraSource);
	}
}

void hanoiTest(){
    printf("---- begins. ----\n");

	printf("2 plates\n");
	hanoi(2, 'A', 'B', 'C');

	printf("3 plates\n");
	hanoi(3, 'A', 'B', 'C');
	
	printf("4 plates\n");
	hanoi(4, 'A', 'B', 'C');
	
	printf("5 plates\n");
	hanoi(5, 'A', 'B', 'C');

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

void main(){
	hanoiTest();
}

运行结果:

---- begins. ----
2 plates
A -> C
A -> B
C -> B
移动次数:3

3 plates
A -> B
A -> C
B -> C
A -> B
C -> A
C -> B
A -> B
移动次数:7

4 plates
A -> C
A -> B
C -> B
A -> C
B -> A
B -> C
A -> C
A -> B
C -> B
C -> A
B -> A
C -> B
A -> C
A -> B
C -> B
移动次数:15

5 plates
A -> B
A -> C
B -> C
A -> B
C -> A
C -> B
A -> B
A -> C
B -> C
B -> A
C -> A
B -> C
A -> B
A -> C
B -> C
A -> B
C -> A
C -> B
A -> B
C -> A
B -> C
B -> A
C -> A
C -> B
A -> B
A -> C
B -> C
A -> B
C -> A
C -> B
A -> B
移动次数:31

---- ends. ----
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白123**

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值