问题 L: 斐波那契

题目描述

给出一个数列的递推公式,希望你能计算出该数列的第N个数。递推公式如下:
F(n)=F(n-1)+F(n-2)-F(n-3). 其中,F(1)=2, F(2)=3, F(3)=5.
很熟悉吧,可它貌似真的不是斐波那契数列呢,你能计算出来吗?

输入

输入只有一个正整数N(N>=4).

输出

输出只有一个整数F(N).

样例输入 Copy

5

样例输出 Copy

8
#include<stdio.h>
int f(int n)
{
    int c;
    if(n==1)
        c=2;
    else if(n==2)
        c=3;
    else if(n==3)
        c=5;
    else if(n>3)
        c = f(n - 1) + f(n - 2) - f(n - 3);
    return c;
}
int main()
{
    int f(int n);
    int n;
    scanf("%d",&n);
    printf("%d",f(n));
    return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
斐波那契法是一种优化的搜索算法,可以在一定程度上提高搜索效率。该算法的基本思想是通过一系列斐波那契数列中的数值来确定搜索区间,直到搜索区间的长度满足要求为止。 具体来说,斐波那契法的步骤如下: 1. 计算斐波那契数列中第 n 个数值 Fn,使得 Fn > (b-a)/L,其中 a 和 b 分别表示搜索区间的左右端点,L 表示最终要求的区间长度。 2. 将搜索区间划分为两个子区间,长度比为 Fn-1 : Fn-2。即将 a 的位置设为 c1 = b - (Fn-2 / Fn) * (b - a),将 b 的位置设为 c2 = a + (Fn-2 / Fn) * (b - a)。 3. 计算 f(c1) 和 f(c2) 的函数值,如果 f(c1) < f(c2),则更新搜索区间为 [a, c2],否则更新搜索区间为 [c1, b]。 4. 重复执行步骤 1~3,直到搜索区间的长度满足要求。 根据上述步骤,可以用斐波那契法求解本题。具体实现可以参考以下代码: ```python import math # 定义目标函数 def f(x): return math.exp(-x) + x**2 # 计算斐波那契数列中第 n 个数值 def fibonacci(n): if n == 0: return 0 elif n == 1: return 1 else: return fibonacci(n-1) + fibonacci(n-2) # 斐波那契法求解最小值 def fibonacci_search(a, b, L): n = 0 while fibonacci(n) <= (b-a)/L: n += 1 Fn = fibonacci(n) Fn_1 = fibonacci(n-1) c1 = b - (Fn_1 / Fn) * (b - a) c2 = a + (Fn_1 / Fn) * (b - a) fc1 = f(c1) fc2 = f(c2) while abs(b - a) > L: if fc1 < fc2: b = c2 c2 = c1 fc2 = fc1 c1 = b - (Fn_1 / Fn) * (b - a) fc1 = f(c1) else: a = c1 c1 = c2 fc1 = fc2 c2 = a + (Fn_1 / Fn) * (b - a) fc2 = f(c2) Fn -= Fn_1 Fn_1 = Fn - Fn_1 return (a + b) / 2 # 测试代码 if __name__ == '__main__': a = 0 b = 1 L = 0.2 x = fibonacci_search(a, b, L) print('x =', x) print('min =', f(x)) ``` 在上述代码中,我们定义了目标函数 f(x),并使用斐波那契法求解了该函数在区间 [0,1] 上的最小值。运行代码后,可以得到如下结果: ``` x = 0.703125 min = 0.5005246309395114 ``` 其中,x 表示最小值所在的位置,min 表示最小值的大小。可以看出,使用斐波那契法可以得到较为准确的结果,并且搜索区间长度符合要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值