我用Matlab编写了两个函数;一个是求输入的阶乘另一个是求斐波那契数列的第n项。我现在正试图为每个函数制作一个脚本-一个计算欧拉数到10个小数,另一个计算倒数斐波那契数到10个小数。
图片在这里
我已经分别为阶乘和斐波那契数列创建了以下两个函数。
function [ nfactorial ] = get_fact( n )
%input a non-negative integer
%output is factorial of that integer
for i=0:n
nfactorial=prod(1:n);
end
和
function [ F ] = get_fib( k )
if k < 0
fprintf('positive integer please')
end
k = k + 1;
F(1) = 0; % 0th Fibonacci term
F(2) = 1; % 1st Fibonacci term
F(3) = 1; % 2nd Fibonacci term
i = 4;
while k >= i
F(i) = F(i-1) + F(i-2);
i = i + 1;
end
F = F(k)
end
我该如何把这些放到脚本中呢?
我试着:
for i = 0:n
e = prod(1 / get_fact( i ))
end
但是这个返回错误,显然没有容差集,所以如果它有效,它将是无限的。我从来没有把一个函数到一个脚本,所以任何帮助将不胜感激。
函数的语法和调用函数在每种情况下都很好。另一方面,你的函数有一些语义问题。
In get_fact
:
function [ nfactorial ] = get_fact( n )
%input a non-negative integer
%output is factorial of that integer
for i=0:n
nfactorial=prod(1:n);
end
prod(1:n)
将从1
乘到n
,参见help :
和help prod
。所以它自己精确地计算了阶乘!不需要对i
进行循环:您只需一遍又一遍地计算相同的东西。更严重的是:get_fact(0)
会给你0,这是不应该的。为这种情况准备函数!
In get_fib
:
function [ F ] = get_fib( k )
if k < 0
fprintf('positive integer please')
end
k = k + 1;
F(1) = 0; % 0th Fibonacci term
F(2) = 1; % 1st Fibonacci term
F(3) = 1; % 2nd Fibonacci term
i = 4;
while k >= i
F(i) = F(i-1) + F(i-2);
i = i + 1;
end
F = F(k)
end
如果k<0
,则打印一条消息,但之后不做任何额外的操作。这应该是一个错误消息,因此您应该使用error
而不是fprintf
,或者将F=NaN; return
写在fprintf
之后,以便提前从函数返回(没有正式错误)。否则,这个函数对我来说似乎很好。
现在,如果您将get_fact
保存到get_fact.m
和get_fib
保存到get_fib.m
在您的MATLAB路径(始终包括当前目录)的某个地方,您可以将它们称为get_fact(3)
和类似的get_fib()
。
但是你的电话也有问题:
for i = 0:n
e = prod(1 / get_fact( i ))
end
这里您将再次调用e = prod(1 / get_fact( i ))
为每个i
, 在每一步覆盖e
。你显然不想这样。你应该定义一个向量来代替e
,并在最后对其内容求和,或者在每次迭代中增加标量e
的值(但随后你必须将其初始化为0),而prod(1/get_fact(i))
只会给你1/get_fact(i)
,因为这个量是一个标量。在任何情况下,你都需要一个和,你必须用不同的方法来做(见前面的几句话)。
你的老师所说的公差与循环的截止有关,当你增加e
的值时,即无限和的近似值。首先,你可以取一个给定的最大阶近似,如果它能正常工作,那么你就可以实现容差了。