Me Ajudem com essa Dúvida

13. Re: Me Ajudem com essa Dúvida

Paulo
paulo1205

(usa Ubuntu)

Enviado em 14/10/2015 - 17:13h

lcavalheiro escreveu:

Não foi um caso de álgebra, meu caro. Eu apenas usei um pouco de lógica para simplificar a questão.


Lamento, mas você está enganado. Você não usou processos lógicos (indução, dedução, abdução), mas simplesmente uma ferramenta algébrica de mudança de variável.

O que é mais fácil de obter: cinco números inteiros, ímpares e distintos entre si que somem 35, ou cinco números inteiros distintos entre si que somem 15?


O esforço é exatamente o mesmo para qualquer pessoa que saiba contar até 35.

Trabalhar com a forma simplificada da questão facilitará até mesmo a elaboração do algoritmo com o qual o autor da pergunta queira trabalhar, e essa é a razão pela qual Cálculo aparecer como disciplina em várias graduações relacionadas à TI.


Pois é. Perceba que você, ao criar seu a'=(a-1)/2, esqueceu de considerar que a' pode valer zero quando a valer 1 (lembrando que 1 é natural e ímpar!). Talvez por isso você tenha tido dificuldade em ver claramente que há mais do que uma solução para o problema, tanto para a soma de cinco ímpares positivos distintos que dá 35, quanto para sua análoga, de cinco naturais distintos que dá 15.


  


14. Re: Me Ajudem com essa Dúvida

Luís Fernando C. Cavalheiro
lcavalheiro

(usa Slackware)

Enviado em 14/10/2015 - 17:22h

paulo1205 escreveu:

lcavalheiro escreveu:

Não foi um caso de álgebra, meu caro. Eu apenas usei um pouco de lógica para simplificar a questão.


Lamento, mas você está enganado. Você não usou processos lógicos (indução, dedução, abdução), mas simplesmente uma ferramenta algébrica de mudança de variável.

Na verdade eu usei e abusei de indução nessas demonstrações, mas como tanto os passos indutivos quanto as hipóteses indutivas são triviais, preferi não ocupar tempo escrevendo-as.

paulo1205 escreveu:
O que é mais fácil de obter: cinco números inteiros, ímpares e distintos entre si que somem 35, ou cinco números inteiros distintos entre si que somem 15?


O esforço é exatamente o mesmo para qualquer pessoa que saiba contar até 35.

Fato. Mas o que é mais difícil de se garantir: que apenas números ímpares distintos entre si estejam sendo somados para dar 35, ou que apenas números distintos estejam sendo somados para dar 15? Quanto mais critérios, mais etapas de verificação são necessárias, e aí aumenta a complexidade do programa como um todo.

paulo1205 escreveu:
Trabalhar com a forma simplificada da questão facilitará até mesmo a elaboração do algoritmo com o qual o autor da pergunta queira trabalhar, e essa é a razão pela qual Cálculo aparecer como disciplina em várias graduações relacionadas à TI.


Pois é. Perceba que você, ao criar seu a'=(a-1)/2, esqueceu de considerar que a' pode valer zero quando a valer 1 (lembrando que 1 é natural e ímpar!). Talvez por isso você tenha tido dificuldade em ver claramente que há mais do que uma solução para o problema, tanto para a soma de cinco ímpares positivos distintos que dá 35, quanto para sua análoga, de cinco naturais distintos que dá 15.


Eu não defini a'=(a-1)/2, mas a=(2a'+1). Volta lá e lê com calma. Se a'=0, a=1. a jamais poderá ser 0 porque 0 não é número ímpar. Você criticou a metodologia sem ler direito? Pois afirmar que defini a'=(a-1)/2 foi ou não ter lido ou falta de atenção, e nos dois casos suas refutações ficariam invalidadas.

Ademais, quem tem que ser um número inteiro e ímpar é o a, não o a'. a' é apenas um passo indutivo, enquanto a é o número que o programa deve achar. O a' precisa ser apenas inteiro. Se a' não for inteiro, então a não será inteiro, mas a' pode ser par que a será inteiro e ímpar sempre.

--
Luís Fernando Carvalho Cavalheiro
Public GPG signature: 0x246A590B
Só Slackware é GNU/Linux e Patrick Volkerding é o seu Profeta


15. Re: Me Ajudem com essa Dúvida

Paulo
paulo1205

(usa Ubuntu)

Enviado em 14/10/2015 - 17:53h

lcavalheiro escreveu:

Como os números negativos existem, esse seu algoritmo vai computar eternamente, pois -9999+9999+10007-10013+39=35, por exemplo, também atenderia aos critérios. Logo, um algoritmo tal vai ser reprovado pois nunca pararia de computar, já que os números inteiros são infinitos.


Você pode notar que minhas perguntas iniciais foram para perguntar ao autor do tópico quais eram realmente as restrições e o que ele queria que o programa produzisse.

Eu não duvido que o professor seja um bocó que não sabe que um número inteiro pode ter valor negativo. Tanto como estudante como ao longo dos anos participando de fóruns de ajuda a iniciantes, cansei de ver questões com enunciados absurdamente mal-escritos ou com conceitos completamente mal aplicados.

O tempo de estrada ajuda a gente a identificar o realmente se desejava, embora o que tenha sido dito não signifique exatamente aquilo. Veja que, a partir de certo ponto, eu disse que eu mesmo iria fazer minhas assunções de parcelas positivas.

Então, meu caro, não se preocupe. O meu algoritmo termina de executar.

A saída para essa questão seria por análise combinatória, pelo menos se a questão envolvesse apenas os números naturais. Vamos voltar à idéia de que a'+b'+c'+d'+e'=15.


Pode ser que vá por aí também, mas não é o que eu indicaria. Uma função recursiva que recebe um índice para um array e o valor do próximo elemento, a ser usado a partir daquele índice, é como eu faria.


16. Re: Me Ajudem com essa Dúvida

Paulo
paulo1205

(usa Ubuntu)

Enviado em 14/10/2015 - 18:10h

lcavalheiro escreveu:

Eu não defini a'=(a-1)/2, mas a=(2a'+1). Volta lá e lê com calma.


Eu li com toda a calma do mundo. De fato, você expressou “a=(2a'+1)”, mas isso implica necessariamente que “a'=(a-1)/2”, ou a Matemática mudou recentemente, e ninguém me avisou?

O limite inferior de a, dado que ele tem de ser um número ímpar e natural, é 1. Se você substituir esse valor em qualquer uma das duas formas expressas acima, vai concluir que o valor inferior de a' é 0.

Se a'=0, a=1. a jamais poderá ser 0 porque 0 não é número ímpar.


E quem falou em a=0? Eu falei literalmente que “a' pode valer zero quando a valer 1”. Você é que inventou um limite inferior para a' que não condiz com a mudança de variáveis que você mesmo propôs.

Em tempo: mudança de variáveis é uma ferramenta algébrica muito útil, mas a condição sine qua non para que ela seja garantidamente válida é que todos os valores do domínio da variável de origem possuam um correspondente no domínio da variável destino.

Você criticou a metodologia sem ler direito? Pois afirmar que defini a'=(a-1)/2 foi ou não ter lido ou falta de atenção, e nos dois casos suas refutações ficariam invalidadas.


Camarada, sem querer ser (muito) chato, mas que acho que você está precisando relaxar, pois é você que não está enxergando direto o que eu estou escrevendo.


17. Re: Me Ajudem com essa Dúvida

Paulo
paulo1205

(usa Ubuntu)

Enviado em 14/10/2015 - 18:45h

Prezados,

Eu não costumo entregar soluções de bandeja. Contudo, como se disse com tanta veemência que a solução seria impossível ou requereria uma teoria complicada, eis um contra-exemplo em poucas linhas (que provavelmente pode ser otimizado, bem como ganhar verificações de valores dos parâmetros, mas não é o foco aqui).

#include <iostream>

const unsigned SUM=35;
const unsigned N_TERMS=5;

bool show_odd_terms(unsigned index, unsigned term){
static unsigned terms[N_TERMS];
unsigned partial_sum=0;
unsigned i;
for(i=0; i<index; i++)
partial_sum+=terms[i];
if(partial_sum>SUM)
return 0;
if(index+1==N_TERMS){
unsigned last_term=SUM-partial_sum;
if((last_term&1) && last_term>terms[index-1]){
for(i=0; i<N_TERMS-1; i++)
std::cout << terms[i] << '+';
std::cout << last_term << '=' << SUM << '\n';
return true;
}
return false;
}
terms[index]=term;
while(show_odd_terms(index+1, terms[index]+2))
terms[index]+=2;
return terms[index]!=term;
}

int main(){
return !show_odd_terms(0, 1);
}



18. Re: Me Ajudem com essa Dúvida

Paulo
paulo1205

(usa Ubuntu)

Enviado em 14/10/2015 - 19:20h

E agora uma versão com a mudança de variáveis proposta pelo lcavalheiro. Note que o programa não fica realmente mais simples (a não ser pelo fato de eu ter suprimido o teste de se a última parcela é ímpar, mas isso é pouco se comparado às multiplicações necessárias para restaurar a soma original), e que o valor inicial da menor parcela na variável modificada tem de ser zero, como eu disse, e não 1.

#include <iostream>

const unsigned SUM=15;
const unsigned N_TERMS=5;

bool show_terms(unsigned index, unsigned term){
static unsigned terms[N_TERMS];
unsigned partial_sum=0;
unsigned i;
for(i=0; i<index; i++)
partial_sum+=terms[i];
if(partial_sum>SUM)
return 0;
if(index+1==N_TERMS){
unsigned last_term=SUM-partial_sum;
if(last_term>terms[index-1]){
for(i=0; i<N_TERMS-1; i++)
std::cout << terms[i] << '+';
std::cout << last_term << '=' << SUM << '\t';
for(i=0; i<N_TERMS-1; i++)
std::cout << 1+2*terms[i] << '+';
std::cout << 1+2*last_term << '=' << N_TERMS+2*SUM << '\n';
return true;
}
return false;
}
terms[index]=term;
while(show_terms(index+1, terms[index]+1))
terms[index]++;
return terms[index]!=term;
}

int main(){
return !show_terms(0, 0);
}




01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts