我正在尝试编写一个接受非整数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
任何形式的帮助都将受到高度赞赏。
答案 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
,然后您将从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
答案 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
是一个整数。