数据结构与算法(一): 递归 (斐波那契- 汉诺塔)

总结了有关递归的经典算法,斐波那契和汉诺塔,随着学习的深入,还在不断更新中

一、递归是算法中很常见的问题,可以将问题分为两个部分, 一是对应单独某些元素(一般为首元素),直接求解,帮助递归跳出循环;另一个对应剩余部分, 结构与原问题相同, 递归得解

二、经典问题

1.斐波那契

问题形式为:  0   1   1   2   3   5   8   13   

后一项为前两项的和

最简单的方法使用递归函数

#include <iostream>
int Fibonacci (int n)  //斐波那契
{
    if (n <= 1)
		return n;
	else 
		return Fibonacci(n-1) + Fibonacci(n-2);

}

但是使用递归会造成重复计算n之前的数字,比如要想计算f(5),则f(4) = f(3) + f(2);  f(3) = f(2) +f(1) ; f(2) = f(1) +f(0); 需要计算2遍f(2),n越大,所需重复计算就越多

所以使用一种改进算法,

int Fibonacci1(int n)
{
	if (n <= 1)
		return n;
	else 
	{
		int firstnum = 0;
		int secondnum = 1;
		int result;
		for (int i = 2; i <= 2; i++)
		{
			result = firstnum + secondnum ;
			firstnum =  secondnum;
		    secondnum  = result;
		}
		return result ;
	}
}

还有常常用到的复杂度为logn 的算法后续还会补充


2. 汉诺塔 

推荐博客https://www.cnblogs.com/yanlingyin/archive/2011/11/14/2247594.html   这篇觉得说的还是不错的

附上实现代码

#include <iostream>
using namespace std;
void moveOne(int num, string first, string third){}
void move (string first, string second, string third, int num)
{
	 if(num == 1)  
        moveOne(1, first, third);
	 else 
	 {
		 move(first, third, second, num-1);//将 N-1 从第一杆借助第三杆移至第二杆
		 moveOne(num, first, third);//将N从第一杆移至第三杆
		 move(second, first, third, num-1);//将N-1从第二杆借助第一杆移至第三杆
	 }

    原文作者: 汉诺塔问题
    原文地址: https://blog.csdn.net/haikuotiankong7/article/details/78019545
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞