for循环的基本结构

时间:2016-03-03 05:13:25

标签: matlab for-loop factorial

我正在尝试编写一个接受非整数n的MATLAB函数,然后返回它的阶乘,n!。我应该使用for循环。我试过

"对于n> = 0"

但这不起作用。我有办法解决这个问题吗?

我在这里写了这段代码,但这并没有给我正确答案..

    function fact = fac(n);
    for fact = n
        if n >=0
            factorial(n)
            disp(n)
        elseif n < 0
            disp('Cannot take negative integers')
        break
        end
    end

任何形式的帮助都将受到高度赞赏。

2 个答案:

答案 0 :(得分:3)

您需要read the docs 我强烈建议您做一个基本的教程。文档陈述

for index = values
    statements
end

因此,您for n >= 0的第一个想法是完全错误的,因为for不允许使用>。这就是你编写while循环的方式。

您对for fact = n的下一个想法确实符合for index = values的模式,但是,您的values是单个数字n,因此此循环只有一个单次迭代显然不是你想要的。

如果您想从1循环到n,则需要创建一个向量(即文档中的values),其中包含1中的所有数字到n。在MATLAB中,您可以这样轻松地执行此操作:values = 1:n。现在,您可以致电for fact = values,然后您将从1n一直进行迭代。但是,使用这个中间变量values是非常奇怪的做法,我只是用它来说明文档正在谈论的内容。正确的标准语法是

for fact = 1:n

现在,对于一个因子(虽然从技术上讲你会得到同样的东西),实际上从n循环到1更清楚。所以我们可以通过声明步长-1

来做到这一点
for fact = n:-1:1

所以现在我们可以找到这样的阶乘:

function output = fac(n)
    output = n;
    for iter = n-1:-1:2 %// note there is really no need to go to 1 since multiplying by 1 doesn't change the value. Also start at n-1 since we initialized output to be n already
        output = output*iter;
    end
end

在您自己的函数中调用内置factorial函数确实违背了本练习的目的。最后我看到你添加了一点错误检查,以确保你没有得到负数,这是好的,但检查不应该在循环内!

function output = fac(n)
    if n < 0
        error('Input n must be greater than zero'); %// I use error rather than disp here as it gives clearer feedback to the user
    else if n == 0
        output = 1;  %// by definition
    else
        output = n;
        for iter = n-1:-1:2 
            output = output*iter;
        end
    end
end

答案 1 :(得分:0)

我没有明白这一点,你想要做什么&#34; for&#34;。我想,你想做的是:

function fact = fac(n);
    if n >= 0
        n = floor(n);
        fact = factorial(n);
        disp(fact)
    elseif n < 0
        disp('Cannot take negative integers')
        return
    end
end

根据您的偏好,您可以将floor(向无穷远方向舍入)替换为round(向最接近的整数舍入)或ceil(向无穷大方向舍入)。任何循环操作都是必要的,以确保n是一个整数。