【问题标题】:Calculate the function of f(i) [closed]计算 f(i) 的函数
【发布时间】:2016-03-02 11:10:19
【问题描述】:

当i为正整数时,存在满足下列条件的函数f(i)。

f(0) = 0,
f(1) = 1
f(i) = f(i-1) + f(i-2)

所以,基于以上,我想写一个程序来确定f(i)。 并编写程序确定 f(1000)。

【问题讨论】:

  • 什么编程语言,到目前为止你尝试过什么?

标签: function fibonacci


【解决方案1】:

由于您似乎要让编程语言保持开放状态,所以我选择 python 来处理这些事情。

你可以这样做:

def f(i):
    if i == 0:
        return 0
    elif i == 1:
        return 1
    return f(i-1)+f(i-2)

如果你想更花哨和更高效,请使用迭代器:

def f():
    a, b = 0, 1
    while True:            
        yield a            
        a, b = b, a + b

代码运行速度非常快:

for i, val in enumerate(f()):
    if i == 1000:
        print val
        break

并返回您想要的值 f(1000),即:

43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875 P>

@DmitryBychenko:你返回的值实际上是 f(999)。

@MartinEvans:您的代码实际上不正确(减 1)。一种显而易见的方式是 f(1) 和 f(2) 返回的值是错误的:

>>> def f(i):
...     a,b = 0, 1
...     for i in range(i-1):
...             a,b = b, a+b
...     return a
... 
>>> f(0)
0
>>> f(1)
0
>>> f(2)
1
>>> f(3)
1

【讨论】:

  • 什么是ab 类型?如果它们是整数,您将有一个溢出,如果它们是双精度,您将失去精度
  • 不,它们是整数,但 python 会智能地处理它,因此不会溢出,也不会损失精度。
  • 你计算了1001th个数,我已经完成了1000th,注意enumerate(f())0开始,而不是从1开始;另一个问题是,在问题f(0) = 0, f(1) = 1 中,通常我们声明f(0) = 1, f(1) = 1,所以新定义 fibo(x)标准 fibo(x-1)wolframalpha.com/input/?i=fibonacci+999
  • 不,这是不正确的。 f(0) = 0, f(1) = 1, f(2) = 1, f(3) = 2, ... f(1000) 是我给出的数字。 f(3) 在你的函数中返回什么?
  • 你是对的,f(0) = 0,而不是f(1) = 0
【解决方案2】:

以下 Python 3.0 脚本将起作用:

def f(i):
    a, b = 0, 1

    for i in range(i):
        a, b = b, a + b

    return a

print(f(0))
print(f(1))
print(f(2))
print(f(3))
print(f(1000))

给你:

0
1
1
2

43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875 P>

【讨论】:

  • 埃文斯,我的解释可能不清楚。因此,我修改了我的解释,以便可以轻松理解问题。请您看一下上面修改后的问题。
  • 我更新了,是这个意思吗?
  • 是的,这是预期的结果。
【解决方案3】:

第 100 个斐波那契数是一个巨大的值,因此需要BigInteger (C#) 或其类似物。 C# 实现可以是这样的(我怀疑它是否会被接受为作业代码)。

private static IEnumerable<BigInteger> fibo() {
  yield return 0;
  yield return 1;

  BigInteger first = 0;
  BigInteger second = 1;

  while (true) {
    BigInteger result = first + second;

    first = second;
    second = result;

    yield return result;
  }
}

// Skip(1000) since it's defined that f(0) == 0 - unusual sequence starting;
// in mathematics sequences usually started from the 1st item
Console.Write(fibo().Skip(1000).FirstOrDefault().ToString());

答案是

43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875 P>

【讨论】:

  • 您好,德米特里,谢谢。我已经修改了问题,请您看一下修改后的问题。
  • Dmitry,您的解释和解决方案符合我的预期。很好的支持。
【解决方案4】:

显然,这需要 bc:

#!/usr/bin/bc --quiet

define fib(n) {
auto a,b,i;
if(n<2)return n;a=0;b=1;for(i=1;i<n;++i){c=a+b;a=b;b=c}return b;}

print fib(1000), "\n"
quit

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多