Conjuntura de Collatz
Considere um número inteiro positivo qualquer. Defina uma série que tenha início com esse número e tais que os próximos número são definidos da seguinte maneira:
1. Caso o número anterior seja par, divida-o por dois;
2. Caso o número anterior multiplique-o por três e acrescente 1.
Assim, por exemplo, se a sequência se iniciar com o número três, o próximo número da sequência será 10, por três é ímpar e 3 vezes 3 mais 1 é igual a 10, o número depois do 10 será 5, pois dez é par e, portanto, devemos dividí-lo por 2, para obter 5. Já o número após 5 será 16 (=5 x 3 + 1). Depois virão os números 8, 4, 2, 1, 4, 2, 1, 4, 2, 1, . . .
A chamada conjuntura de Collatz diz que, qualquer que seja o número inteiro positivo do início dessa série, ela necessariamente chegará ao número 1. Embora essa conjectura jamais tenha sido demonstrada, ela já foi verificada para números iniciais até, pelo menos, 5 x 2^60.
Você deverá enviar um script do R que defina uma função que calcule com base no número inicial, o número de elementos dessa série anteriores ao primeiro número 1. Por exemplo, se você der a essa função o nome collatz, então,
collatz(1) deve retornar 0, visto que não existe nenhum número anterior ao primeiro número da sequência 1, 4, 2, 1, ...
collatz(5) deve retornar 5, visto que, iniciando com o número 5, a sequência definida acima será
5, 16, 8, 4, 2, 1, 4, 2, 1, ...
de tal sorte que o primeiro 1 é antecedido de 5 números.
Para realizar essa atividade, inicialmente dê uma olhada no script do R em anexo que contém exemplos explicados que podem ser úteis.
Agora crie um script que gere uma função que gere quantos passos são necessário para que a sequencia de Collatz com início no número inteiro positivo informado atinja o número 1. (Veja explicação da sequência de Collatz na descrição da tarefa). Sua função deve:
a) testar se o argumento passado à função é numérico e retornar uma mensagem de erro caso contrário (ver exemplos);
b) testar se o argumento é positivo e retornar uma mensagem de erro caso contrário (idem);
c) testar se o número é inteiro e, caso contrário, emitir uma mensagem de aviso e arredondar o número para o inteiro positivo mais próximo;
d) iniciar uma variável com valor zero que servirá como um contador;
e) incluir um loop while no qual a variável com o valor (corrigido para inteiro, caso necessário) passado a função assuma metade de seu valor caso este seja par ou 3 vezes mais 1 esse valor, caso ele seja ímpar (consulte as explicações na tarefa) e o contador seja acrescido de uma unidade; esse loop deverá se repetir até que a variável assuma o valor igual a 1;
f) retornar o valor do contador.
Os arquivos em anexo são idênticos em conteúdo. A única diferença está no encoding. No arquivo 'funcoes.R' o enconding é o padrao do windows (leia esse arquivo com o RStudio ou outro editor de texto caso esteja usando qualquer versão do windows) o arquivo 'exemplos.R' está codificado em utf-8 e deve ser usado se seu sistema operacional é ios ou linux.
- 7 July 2017, 5:21 PM
- 7 July 2017, 5:21 PM