for循环的基本结构

Basic structure of a for loop

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

"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

我们将不胜感激任何形式的帮助。

您需要 read the docs 我强烈建议您做一个基础教程。文档状态

for index = values
    statements
end

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

你的下一个想法 for fact = n 确实符合 for index = values 的模式,但是,你的 values 是一个数字,n,所以这个循环只会进行一次迭代,这显然不是您想要的。

如果你想从 1 循环到 n 你需要创建一个向量,(即文档中的 values)包含来自 [=23] 的所有数字=] 到 n。在 MATLAB 中,您可以像这样轻松地做到这一点:values = 1:n。现在您可以调用 for fact = values,您将从 1 一直迭代到 n。然而,使用这个中间变量 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

我不明白你想用 "for" 做什么。我想,你想做的是:

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 是一个整数。