介绍:
程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
那么我们也可以使用最简单的东西来解释递归—不知道用没有玩过"套娃",这里禁止套娃哦!
接下来我为大家讲一个故事来更加简单的讲解递归: 从前有座山,山里有座庙,庙里有个和尚,和尚在讲故事,从前有座山,山里有座庙,庙里有个和尚,和尚在讲故事,从前有座山…
听完故事我们会发现这个不就是循环嘛,我们要知道递归需要终止条件的,递归其实就是终止条件。可能我们还是不怎么明白,接下来我们就用实例来讲解吧。
实例:
例题:有5个人A B C D E,E比D大2岁,D比C大2岁,C比B大2岁,B比A大2岁,若知道A是10岁,求E多岁。
先附上代码:
#include <iostream>
using namespace std;
int age(int x) //定义递归函数
{
int c; //存放年龄
if (x == 1) //终止条件
{
c = 10;
}
else
c = age(x - 1) + 2; //递归调用
cout << c << endl; //输出每次的结果
return c;
}
int main() //主函数
{
cout << age(5) << endl;
return 0;
}
执行结果:
我们可以使用数学的方法来求一下:
A=10
B=A+2=10+2=12
C=B+2=12+2=14
D=C+2=14+2=16
E=D+2=16+2=18
递归求解过程:
经典案例:
#include <iostream>
//阶乘
using namespace std;
int Leo(int n)
{
int sum = 1;
if (1 == n) //递归终止条件
{
return 1;
}
sum = n * Leo(n - 1);
return sum; //返回阶乘的总和
}
int main()
{
int num;
cin >> num; //输入一个数
cout << Leo(num) << endl; //输出该数的阶乘
return 0;
}
/*
*在求X的阶乘和时
*可以利用递归的思想
*把大问题转化成小问题
*再把小问题转化成更小的问题
*最后得解
意大利数学家列奥纳多•斐波那契命名的斐波那契数列形式如下:
0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584...
那么从这里我们可以看到一定的规律——从第二个数字之后,序列的每个数字都是前面两个数字之和。那么我们就可以把斐波那契数列定义为:
F
i
b
0
=
0
Fib0 = 0
Fib0=0
F i b 1 = 1 Fib1 = 1 Fib1=1
F i b N = F i b N − 1 + F i b N − 2 对 于 所 有 N ≥ 2 FibN = FibN-1 + FibN-2 对于所有 N≥2 FibN=FibN−1+FibN−2对于所有N≥2
那么我们就可以使用程序解决了:首先我们先简化一下出前两个数字之外的斐波那契数
int64_t Fib(int n) //定义递归函数
{
if (n == 0) //基本情况
return 0;
else if (n == 1) //基本情况
return 1;
else //简化
return Fib(n - 1) + Fib(n - 2);
}
然后我们来计算一下前19个斐波那契数列是不是上面写的那样呢。代码如下:
#include <iostream>
using namespace std;
int64_t Fib(int n)
{
if (n == 0)
return 0;
else if (n == 1)
return 1;
else
return Fib(n - 1) + Fib(n - 2);
}
int main(int argc, char const *argv[])
{
for (int i = 0; i < 19; i++)
{
cout << "Fib(" << i+1 << ")=" << Fib(i) << endl;
}
return 0;
}
执行结果: