总结了有关递归的经典算法,斐波那契和汉诺塔,随着学习的深入,还在不断更新中
一、递归是算法中很常见的问题,可以将问题分为两个部分, 一是对应单独某些元素(一般为首元素),直接求解,帮助递归跳出循环;另一个对应剩余部分, 结构与原问题相同, 递归得解
二、经典问题
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从第二杆借助第一杆移至第三杆
}