2016-08-12 5 views
-1

Я смотрел видео по гипотезе 3n + 1 и просто хотел попробовать и посмотреть, смогу ли я создать простую программу для тиражирования нескольких ее циклов.Попытка комбинировать цикл For и If

Что я хотел бы сделать, так это сделать так, чтобы программа принимала номер ввода, решает, является ли это нечетным или четным. Если даже разделите его на 2, а затем используйте это число, чтобы продолжить цикл. Или, если значение нечетное, умножьте его на 3 и добавьте 1, а затем продолжите цикл.

i.e, если число было 7, это странно, так что перейдите к 22, это даже так идти до 11, это странно, так что до 34, это даже так идти до 17 и так далее.

Вот моя попытка, я просто хотел попробовать это для удовольствия и не получил никуда. Я надеюсь, что это просто что-то маленькое, что я должен делать с кодом, если не могу его оставить.

#Want to do 10 loops of n 
#If n is even /2 
#if n is odd n*3 +1 
n = input("enter first value for n") 
for i = (n:10); 
    disp(i) 
    if mod(i, 2) == 0 
    % i is even 
    ans = sprintf("%d", i ," is even") 
    newn = (i/2) 
    disp(ans) 
    else 
    % i is odd 
    ans = sprintf("%d", i ," is odd") 
    disp(ans) 
    newn = (3*n +1) 
    end 
end 

EDIT:

Я имел проблемы с кодом, ответившие так вот обновленный код, который я получил помощь с этим, кажется, работает хорошо. Я не знаю, почему sprintf работал не слишком хорошо.

n = input("enter first value for n") 
for i = 1:10 
    if mod(n, 2) == 0 
    % n is even 
    n = n/2 
    else 
    % n is odd 
    n = 3*n +1 
    end 
end 
+1

Что ваш вопрос? – excaza

+0

Вы смешиваете между 'i' и' n', и не нужны для 'newn' – EBH

ответ

0
clc 

n = input('Enter first value for n : '); 

number_of_loops = 10; 

for i = 1 : number_of_loops 
    disp(['Loop # ', num2str(i)]); 
    if mod(n, 2) == 0 
     disp([num2str(n), ' is even']); 
     n = n/2; 
    else 
     disp([num2str(n), ' is odd']); 
     n = 3*n + 1; 
    end 
    disp(['New number = ', num2str(n)]); 
end 
+0

Спасибо, Прахар. Это отлично работает. Я не знал о num2str. –

+0

Вы также можете добавить чек для n == 1 до окончания цикла for и выйти из него. Он может рассказать вам, сколько итераций требуется, прежде чем достигнуть 1 в первый раз. Что-то вроде: 'if n == 1 disp (['Достигнуто 1 в', num2str (i), 'итерации']); ломать; end' – Prakhar

+0

@JamesBlackwell Prakhar, по-видимому, стесняется сказать так, но если это правильно ответит на ваш вопрос, то, пожалуйста, разбросьте какое-нибудь хорошее моджо, приняв его как ответ (нажав на отметку), а также подумайте о его продолжении. –

0

Были несколько вопросов, с кодом, в том числе, но не ограничиваясь переменные, которые не были расчетными, но не использовали, и странное сочетание i и n.

Не уверен, если это прекрасно, но я думаю, что это должно быть примерно то, что вы хотите сделать:

#Want to do 10 loops of n 
#If n is even /2 
#if n is odd n*3 +1 
n = 123 
for i = (1:10) 
    disp(i) 
    disp(n) 
    if mod(n, 2) == 0 
    % n is even 
    disp(sprintf("%d%s", n ," is even")) 
    n = (n/2); 
    else 
    % n is odd 
    disp(sprintf("%d%s", n ," is odd")) 
    n = (3*n +1); 
    end 
end 
+0

имеет код публикации. Попробуй еще раз с другим ответом –

+0

@JamesBlackwell Это в значительной степени то, что я предложил. Обратите внимание, что для sprintf у вас было 2 входных параметра, которые вы оба пытались напечатать как десятичные (со странными результатами). В этом ответе показано, как вы могли это назвать. –

+0

Это имеет смысл, спасибо за помощь с этим Деннисом. У меня есть, чтобы узнать –