0

我在 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

但这会返回错误并且显然没有设置容差,所以如果它确实有效,它将是无限的。我从未将函数放入脚本中,因此将不胜感激。

4

1 回答 1

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)将从 到 的数字相乘1n请参见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到MATLAB 路径get_fact.mget_fibget_fib.m某个位置(始终包括当前目录),您可以按照您的尝试将它们称为 asget_fact(3)和类似的。get_fib()

但是你的电话也有问题:

for i = 0:n
    e = prod(1 / get_fact( i ))
end

在这里,您将在e = prod(1 / get_fact( i ))一步覆盖中再次调用。你显然不想要这个。您应该定义一个向量来代替并在最后对其内容求和,或者在每次迭代中不断增加标量的值(但是您必须将其初始化为 0)。并且只会给你,因为这个数量是一个标量。您需要以任何方式求和,并且必须以不同的方式进行(参见前面的几句话)。ieeeprod(1/get_fact(i))1/get_fact(i)

您的老师所说的容差与您增加 的值的循环的截止点有关e,即与无限和的近似值。首先,您可以只取给定的最大近似值,如果它正常工作,那么您就可以着手实现容差。

于 2015-10-09T23:24:54.467 回答