程序设计部分 函数的递归 第2关:用递归实现递推

任务描述
本关任务:使用递归计算裴波那契数列。

相关知识
圆切割问题
给你一个圆,请用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   **********/

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值