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
是一个整数。
我正在尝试编写一个接受非整数 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
是一个整数。