Вам необходимо 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
Спасибо, Дэн! Я очень ценю вашу помощь! :) –