2016-03-03 6 views
1

Я пытаюсь написать функцию MATLAB, которая принимает нецелое число, n, а затем возвращает факториал, n !. Я должен использовать цикл for. Я попытался сБазовая структура цикла for

"при п> = 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 

Любой вид помощи будет высоко оценен.

ответ

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 
+0

Спасибо, Дэн! Я очень ценю вашу помощь! :) –

0

Я не понимаю, что вы пытаетесь сделать с помощью «для».Я думаю, что вы хотите сделать, это:

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 является целым числом.

+0

Может быть, вы должны уточнить, если вы задаете вопрос о 'for'-loops или о том, как заставить вашу функцию работать – serial

+0

Спасибо, что комментировали мое сообщение. Это мой первый проект MATLAB, в котором я должен написать функцию, которая принимает неотрицательное целое число (0 <= k), и возвращает факториал числа, просто используя «for-loop». Прошу прощения за путаницу. Еще раз спасибо, что нашли время. –

+0

Ну просто улучшите решение от Dan с 'floor' /' round'/'ceil', чтобы ваша функция работала с нецелыми значениями – serial

Смежные вопросы