八大算法思想(二)------------------递归算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32211827/article/details/73107138

一,充分利用自己的递归算法思想

    递归算法能够充分挖掘自身的潜力,无论遇到了什么问题,它都会直接或者间接地调用自身的算法去解决。
递归算法思想的原则是有事不求人。即使难以解决解决也要自己解决,即使难以解决也要硬着头皮去解决。递归的自身算法往往用函数的形式体现,所以递归算法需要预先编写功能函数,这些函数是独立的功能,能够实现解决某个问题的具体功能,当需要时直接调用这个函数即可。

1,递归算法的基础

在计算机编程应用中,递归算法对解决大多数问题是十分有效的,她能够使算法的描述变得简介而且易于理解,递归算法有如下3个特点:
(1)递归过程一般通过函数或子过程来实现。
(2)递归算法在函数或子过程的内部,直接或者简介地调用自己的算法。
(3)递归算法实际上是把问题转化为规模缩小了的同类问题的子问题,然后在递归调用函数或过程来表示问题的解。

2 ,在使用递归算法时,注意一下几点                                                                                                                                                                                                                                                                                                                       (1)递归是在过程或 函数中调用自身的过程

        (2)在使用递归策略时,必须有一个明确的递归结束条件,这称为递归出口。

(3)递归算法通常显得很简洁,但是运算效率较低,所以一般不提倡使用递归算法设计程序。

(4)在递归调用过程中,系统用栈来存储每一层的的返回点和局部变量。如果递归次数过多,则容易造成栈溢出,所以一般不提倡用递归算法设计程序。

3,实例----------汉诺塔问题:

一个庙里有三个柱子,第一个有64个盘子,从上往下盘子越来越大。要求庙里的老和尚把这64个盘子全部移动到第三个柱子上。移动的时候始终只能小盘子压着大盘子。而且每次只能移动一个。

1、此时老和尚(称为第1个和尚)他想:要是有一个人能把前63个盘子先移动到第二个柱子上,我再把最后一个盘子直接移动到第三个柱子,再让那个人把刚才的前63个盘子从第二个柱子上移动到第三个柱子上,我的任务就完成了,简单。所以他找了第2个和尚,让其:

         你把前63个盘子移动到第二柱子上

         在我自己把第64个盘子一道第三个柱子上后

         你把前63个盘子移动到第三柱子上

2、第2个和尚接了任务后和第1个和尚一样想:要是有一个人能把前62个盘子先移动到第三个柱子上,我再把最后一个盘子直接移动到第二个柱子,再让那个人把刚才的前62个盘子从第三个柱子上移动到第三个柱子上,我的任务就完成了,所以他也找了比他年轻的和尚叫他第3和尚,让其:

 你把前62个盘子移动到第三柱子上

         在我自己把第63个盘子一道第二个柱子上后

         你把前62个盘子移动到第二柱子上

3、第3个和尚接了任务,又把移动前61个盘子的任务依葫芦话瓢的交给了第4个和尚,等等递推下去,直到把任务交给了第64个和尚为止(估计第64个和尚很郁闷,没机会也命令下别人,因为到他这里盘子已经只有一个了)。

4、到此任务下交完成,到各司其职完成的时候了。完成回推了:

64个和尚移动第1个盘子,把它移开,然后第63个和尚移动他给自己分配的第2个盘子。第64个和尚再把第1个盘子移动到第2个盘子上。到这里第64个和尚的任务完成,第63个和尚完成了第62个和尚交给他的任务的第一步。

从上面可以看出,只有第64个和尚的任务完成了,第63个和尚的任务才能完成,只有第2个和尚任务完成后,第1个和尚的任务才能完成。这是一个典型的递归问题。


/*************************************************************************************************************************
*文件说明:
*       Fibonacci数列实现
*开发环境:
*        Win10+VS2015+OpenCv3.2.0
*时间地点:
*        陕西师范大学.文津楼 2017.6.10
*作者信息:
*        李Sir
**************************************************************************************************************************/
#include<stdio.h>
#include<Windows.h>

int main()
{
	void hanoi(int n,char one,char two,char three);
	int m;
	printf("input the number of diskes:");
	scanf_s("%d",&m);
	printf("the step to move %d diskes:\n",m);
	hanoi(m, 'A', 'B', 'C');
	system("pause");
	return 0;
}

void hanoi(int n, char one, char two, char three)//将n个盘子从one座借助two座移动到three座
{
	void move(char x, char y);
	if (n == 1)
		move(one, three);
	else
	{
		hanoi(n - 1, one, three, two);
		move(one,three);
		hanoi(n-1,two ,one, three);
	}
}

void move(char x, char y)
{
	printf("%c--->%c\n",x,y);
}

                                                                                                                                                                                                                                                                                                                           

猜你喜欢

转载自blog.csdn.net/qq_32211827/article/details/73107138