哪位高手能否告诉我下面个用C写的斐波那契数列哪里出问题了,算出的数据出现了负数,请帮我找下问题所在
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了哪位高手能否告诉我下面个用C写的斐波那契数列哪里出问题了,算出的数据出现了负数,请帮我找下问题所在相关的知识,希望对你有一定的参考价值。
#include "stdio.h"
#include "stdlib.h"
void main()
int
* num;
int
total;
while(true)
printf("请输入斐波那契的个数(注意个数至少3个):\n");
scanf("%d",&total);
num
= (int *) malloc(total*sizeof(int));
num[0]
= 0;
num[1]
= 1;
for(int
i=2;i<=total;i++)
num[i]
= num[i-1] + num[i-2];
printf("第%d个斐波那契数为 %d\n",total,num[total-1]);
#include "stdio.h"
#include "stdlib.h"
void main()
int* num;
int total;
while(true)
printf("请输入斐波那契的个数(注意个数至少3个):\n");
scanf("%d",&total);
num= (int *) malloc(total*sizeof(int));
num[0]= 0;
num[1]= 1;
for(int i=2;i<=total;i++)
num[i]= num[i-1] + num[i-2];
printf("第%d个斐波那契数为 %d\n",total,num[total-1]);
希望回答能帮到你,哪里不清楚再问。追问
输入150的时候
追答你好这是因为那个数字太大,超过了int的范围,望采纳!
本回答被提问者和网友采纳使用reduce方法的斐波那契数列
【中文标题】使用reduce方法的斐波那契数列【英文标题】:Fibonacci sequence using reduce method 【发布时间】:2021-03-01 10:40:33 【问题描述】:所以,我看到有人用reduce方法来计算斐波那契数列。 这是他的想法: (1,0) , (1,1) , (2,1) , (3,2) , (5,3) 对应于 1、1、2、3、5、8、13、21.......
代码看起来像这样
def fib_reduce(n):
initial =(1,0)
dummy = range(n)
fib_n = reduce(lambda prev ,b : (prev[0] + prev[1], prev[0]),
dummy,
initial)
return fib_n[0]
我理解(prev[0] + prev[1] , prev[0])
就像
a, b = b, b + a
。
但是,我不明白这个b
代表什么?
有人可以解释一下b
吗?
【问题讨论】:
我在这里看不到任何递归。 请注意,这不是递归算法。虽然reduce
可以递归实现,但在Python 中它实际上是一个for
循环(pure Python implementation,C implementation)。
【参考方案1】:
使用reduce
重复应用函数
This answer 建议编写自己的函数 repeated
以重复应用函数,而不是使用虚拟的第二个参数调用 reduce
。
我们仍然使用reduce
,但以更实用的方式使用itertools.repeat
。
from itertools import repeat
from functools import reduce
def repeated(func, n):
def apply(x, f):
return f(x)
def ret(x):
return reduce(apply, repeat(func, n), x)
return ret
def fibonacci(n):
get_next_pair = lambda p: (sum(p), p[0])
first_pair = (1, 0)
return repeated(get_next_pair, n)(first_pair)[1]
print(fibonacci(0), fibonacci(1), fibonacci(11))
# 0 1 89
使用线性代数重复应用线性函数
您要应用的函数lambda a,b: b,a+b
恰好是一个线性函数。它可以用一个 2*2 的矩阵来表示。将函数重复应用于二元元组与重复将二元向量乘以矩阵相同。
这很酷,因为利用矩阵的力量比重复应用一个函数要快得多。
import numpy as np
def fibonacci(n):
return np.linalg.matrix_power(np.array([[0, 1],[1,1]]), n).dot(np.array([0,1]))[0]
print(fibonacci(0), fibonacci(1), fibonacci(11))
# 0 1 89
如果你不喜欢单行,这里是用更明确的变量名分解成几行的同一个函数:
import numpy as np
def fibonacci(n):
next_pair_matrix = np.array([[0, 1],[1,1]])
matrix_to_the_nth = np.linalg.matrix_power(next_pair_matrix, n)
first_pair_vector = np.array([0,1])
nth_pair_vector = matrix_to_the_nth.dot(first_pair_vector)
return nth_pair_vector[0]
print(fibonacci(0), fibonacci(1), fibonacci(11))
# 0 1 89
【讨论】:
通过运行t0 = time.perf_counter(); y = fibonacci(10000); t1 = time.perf_counter()
十次并取平均值,将我的reduce
版本与您的答案中的for
-loop 版本进行比较,我得到1.56ms
for-loop; 3.72ms
用于减少;和0.125ms
用于矩阵。
用fibonacci(100000)
我得到:for
loop 74.4ms; reduce
153.4ms;矩阵 0.14 毫秒。
哎呀,你可以忘记矩阵版本的时间。显然,for-loop 和 reduce 版本都使用 python 的大整数,但矩阵版本没有,并且为 fib(100000) 返回不正确的结果。以上是关于哪位高手能否告诉我下面个用C写的斐波那契数列哪里出问题了,算出的数据出现了负数,请帮我找下问题所在的主要内容,如果未能解决你的问题,请参考以下文章