Fibonacci系列如下:
1, 2, 3, 5, 8, 13, 21, ...
如何编写一个计算和打印第n个Fibonacci项(用于n>2
)的脚本,其中n
由用户输入。
这是我尝试过的:
n=input('n: ');
while(n < 3)
disp('must enter number >= 3')
if(n < 3)
fprintf('\n\n Please re-insert again!!\n')
n=input('n: ')
else (n >=3)
fibf(n)=fib(n-1)+fibf(n-2);
end
end
fprintf('the nth value of n is : ,fibf(n)')
但未能打印出正确的解决方案。
答案 0 :(得分:3)
实际上Fibonacci系列从0开始,所以F0 = 0,F1 = 1,F2 = 1等。 递归函数的方法非常慢。你最好使用线性代数方法来计算它。
l1 = (1+sqrt(5))/2;
l2 = (1-sqrt(5))/2;
S = [l1,l2;1,1];
L = [l1,0;0,l2];
C = [-1/(l2-l1);1/(l2-l1)];
k = 15;
y = S * L^k * C;
fprintf('the %dth Fibbonaci number is : %d\n', k, y(2))
the 15th Fibbonaci number is : 610
可以找到证据here。
答案 1 :(得分:1)
除James McNellis指出的fprintf错误外,您还犯了以下错误:
fibf(n)= ...行引用一个名为fib的数组,而不是fibf。
如果用户输入的数字大于3,则while循环会跳过fibf的计算。
如果用户输入的数字小于3且系统提示您重新输入某个号码,则仍会跳过该计算,因为else
应该是else if
。
如果你修复了while / if / else中的逻辑错误,你仍然需要初始化fibf(1)和fibf(2),否则MATLAB将没有它们的值。
可能还有其他错误,这些是我第一眼看到的错误。
通常,逐步执行循环和逻辑语句是调试的最佳方法。 MATLAB会告诉你一些愚蠢的错误,比如忘记初始化fibf或者使用一个不存在的变量,但逻辑很难在不逐行的情况下进行跟踪。在编辑器中,尝试在第一行启用断点(在R2009a中按F12)。然后你可以按F10并逐行查看,看看究竟发生了什么(Windows上的F12和F10,不确定其他操作系统上的等价物)。
答案 2 :(得分:1)
我会这样做:
n = input('n: ');
fib = zeros(1, n);
fib([1 2]) = [1 2];
for i = 3:n
fib(i) = fib(i-1) + fib(i-2);
end
fprintf('the %dth Fibbonaci number is : %d\n', n, fib(n))
或者,这应该也适用:
phi = (1 + sqrt(5))/2;
fibn = round((phi^(n+1) - (1-phi)^(n+1))/sqrt(5));
fprintf('the %dth Fibbonaci number is : %d\n', n, fibn)
除此之外:我通常会将第一个斐波纳契数定义为1和1而不是1和2。