我在Matlab中写了两个函数;一个解决了输入的阶乘,另一个解决了Fibonacci序列的第n项。我现在正在尝试为每个函数创建一个脚本 - 一个用于计算欧拉数到10个小数,另一个用于计算倒数斐波那契数到10个小数。
我分别为factorial和Fibonacci序列创建了以下两个函数。
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
但这会返回错误并且显然没有公差设置,所以如果它确实有效,它将是无限的。我从来没有将函数放入脚本中,所以任何帮助都会受到赞赏。
答案 0 :(得分:0)
在每种情况下,函数的语法和调用函数都很好。另一方面,你的函数有一些语义问题。
在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,但不应该。为这种情况准备你的功能!
在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
保存到MATLAB路径某处的get_fib.m
(总是包含当前目录),您可以将其称为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
值的循环截止值有关,即无限和的近似值。首先,您可以采用给定的近似最大阶数,如果它能够正常工作,那么您可以继续实现容差。