递归算法的几个应用

看了《C++程序设计》(埃里克.罗伯茨)才知道很多问题是可以用递归方式来实现的,递归方式虽然细节步骤繁杂,但对其整体思考是比较简单的。

  • 阶乘
阶乘是最典型最简单的递归,欲知 n! 必先知 (n-1)! 
long Fact(int i)
{
	if (i==0||i==1)
	{
		return 1;
	}
	else
	{
		return i*Fact(i-1);
	}

	return 0;
}
  • 斐波那契

斐波那契数列是指前2项的值均为1,其他项的值等于其前2项的和,

1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...

即    

通项公式又称为“比内公式”,是用无理数表示有理数的一个范例    

 int FBNQ(int i)
 {
	 if (i==0)
	 {
		 return 0;
	 }
	 else if (i==1)
	 {
		return 1;
	 }
	 else
	 {
		 return FBNQ(i-1)+FBNQ(i-2);
	 }
	 return -1;
 }


  • 回文
回文是指对称的字符串,比如level。判断一个字符串S是否为回文的方法为:
  1. 比较S的首尾字符是否相同,若不相同,则不是回文;
  2. 令S=(去掉首尾字符剩余的字符串),判断S是否为回文;
一般将字符数量为1的字符串也认为是回文。

  • 二分查找

  • 汉诺塔

long i=1;

void MoveSingle(char From,char To)
{
	i++;
	cout<<"No"< "< "<


  • 子集求和

  • 字符排列

set GetStrSet(string str)
{
	set strSet;

	if (str.size()==1)
	{
		strSet.insert(str);
	}
	else
	{
		for (int i=0;i strSetTemp=GetStrSet(strRemain);
			for (auto obj:strSetTemp)
			{
				strSet.insert(ch+obj);
			}
		}
	}

	return strSet;
}
  • 数学归纳法
高中时期常用的数学归纳法,是典型的递推或递归的例子。一般(说“一般”是因为最终证明的取值区间不一定x>a,也可能x
  1. 证明某关系R(x)在x=a时成立(高中时期a一般是1或0);
  2. 假设关系R(x)在x=n时成立,证明此时R(x)在x=n+1时也成立(递推);或假设关系R(x)在x=n+1时成立,证明此时R(x)在x=n时也成立(递归)。
当时只知道使用,不知道它到底是如何正确的,其核心原来是递推或递归。以递推为例:由步骤1知,x=a时R(x)成立;由步骤2知,x=a+1时R(x)成立;由步骤2知,x=a+2时R(x)成立;由步骤2知,x=a+3时R(x)成立.....

你可能感兴趣的:(C/C++基础,算法)