任务描述
本关任务:使用递归计算裴波那契数列。
相关知识
圆切割问题
给你一个圆,请用n刀去切割它,求能得到的最多片数,如图:
如果用q(n)来代表切n刀能得到的最多的片数,那么我们能发现以下结论:
q(0) = 1
q(1) = 1 + 1 = 2
q(2) = 1 + 1+ 2 = 4
q(3) = 1 + 1 + 2 + 3 = 7
q(4) = 1 + 1 + 2 + 3 + 4 = 11
......
q(n) = q(n-1) + n
很容易想到用循环,也就是迭代方法解决问题,比如:
int q(int n)
{
int c = 1;
for(int s = 1;s <= n;s++)
c += s;
return c;
}
如果我们将上面那个结论反过来看,即:
q(n) = q(n - 1) + n
q(n - 1) = q(n - 2) + n - 1
......
q(1) = q(0) + 1
q(0) = 1
就会发现每一个q(n)都依赖于它的前一个值q(n - 1),有一种递归关系在其中,这样我们就可以用递归来实现这个算法了,比如:
int q(int n)
{
if(n == 0)
return 1;
return q(n - 1) + n; //与公式中的形式一样
}
递归方式与递推方式相比,区别在于关注点不同。
递推方式关注点在起始值。
递归方式关注点在求解目标。
虽然它们都在表现第n次和第n-1次之间的关系,但递归方式更加明显,而且更加简洁。
总的来说,递归算法的关键在于以下几点:
找到第n次与第n-1次之间的关系。
确定第1次的结果。
编程要求
之前我们使用过迭代方法求斐波那契数列,这次希望你用递归来实现。
右侧编辑器中有一个函数Fib,它有一个参数n,存有一个正整数。
请在此函数中求出数列中第n个数,并将其输出,占一行。
输入数据由评测系统读取,并传递给Fib函数。具体见测试说明。
测试说明
平台会对你编写的代码进行测试:
预期输入:1
预期输出:1
预期输入:3
预期输出:2
参考代码:
#include <iostream>
using namespace std;
/********** Begin **********/
int fibonacci(int n) {
if (n == 1 || n == 2) {
return 1; // 第1和第2项都是1
}
return fibonacci(n - 1) + fibonacci(n - 2); // 递归调用
}
//可以在此自由增加函数
void Fib(int n) {
//在此处输出斐波那契数列第n项
cout << fibonacci(n) << endl;
}
/********** End **********/