递归初识——汉诺塔问题

何为递归:程序调用自身的编程技巧称为递归( recursion)

 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。

一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

因此递归通常需要一个边界条件,就感觉递归是从后往前,前就是边界,到了就结束递归。

如果递归没有边界或者递归次数过多,就会导致栈溢出,提示出错。

递归中有一个典型的问题:汉诺塔问题。

汉诺塔问题:

相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。

那么这个问题就可以分为三步:

(1)把A的n-1个放到B上,C为中介

(2)把A的最后一个直接放到C上,使得最大的就在最下面

(3)再把B中的n-1个通过A为中介,放到C上

其中就第二步是可以直接完成的,第一、三步是不行的,因为第一步又可以继续分解为三步,这样子就不断的重复步骤,也就是使用同一个程序,即递归。

那这样子就需要有一个边界条件:直到A上只剩下一个 的时候,就直接放到C就可以了,即数量为1的时候,就是递归结束条件。

汉诺塔问题实现代码(C++):

/*
	思路:
	A,B,C
	把A的n-1放到B上,剩下一个就放到C
	然后再把B上的n-1放到C
	递归终点就是剩下最后一个,那就直接从左边放到右边 
	
	递归其实就是掌握规律后,按照规律写,其实是从后往前,所以有一个终止条件 
*/ 

#include<cstdio>
#include<iostream>

void hanoi(int num,char l,char m,char r)
{
	if(num == 1)
		printf("%c-->%c\n",l,r);
	else
	{
		hanoi(num-1,l,r,m);    
		printf("%c-->%c\n",l,r);  //剩下的一个就从左边放到右边 
		hanoi(num-1,m,l,r);   // 然后为了实现全部n个到右边,就需要把剩下的n-1个放到右边 
	}
	
}

int main()
{
	int n;
	scanf("%d",&n);
	hanoi(n,'A','B','C');   // 表示要把n个东西从A放到C 
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Mikchy/article/details/81451584