ao invés de vir aqui e enrolar o povo… perguntando como fazer, dizendo que eu estou estudando… vou direto ao assunto…
tenho um trabalho de faculdade para entregar hoje (em Assembly), só que não consegui nem fazer o algorítmo em portugues, nem C, nem Java… ou seja… minha lógica foi pouca para o programa, hehehehe
O problema é o seguinte… preciso fazer um programa que faça uma potenciação. “Ah… isso é facil”, foi oque muita gente deve ter pensado e até já começou a escrever o código… mas agora vem oque eu estou me batendo… preciso que seja só utilizando soma e subtração, não posso utilizar nenhuma multiplicação. Se eu quiser fazer 3 * 3, tenho que fazer 3 + 3 + 3.
Faça uma série de loops encadeados. Ou melhor, no primeiro verifique qual é o número do expoente. Caso seja cinco faço um loop cinco vezes. Dentro deste loop você tem outro que verifica qual o valor da base e soma a si mesma o seu valor tantas vezes quanto for o seu valor.
Algo assim…
[code]int base = 10;
int expoente = 3;
int result = 0;
for(int x = 0; x < expoente; int++){
for(int y = 1; y < base; int++){
result = result + base;
}
}[/code]
Não testei isso… deve ter erros, inclusive alguma coisa de lógica no segundo loop…
Poste o problema na integra… só com essas informações não dá para focar no problema… e vai gerar varias opniões diferentes que talvez não sirva para a resolução da mesma…
public class Potencia{
public static void main(String []args){
String b,e;
try{
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
System.out.println(“Digite base”);
b=in.readLine();
int x=Integer.parseInt(b);
System.out.println(“Digite expoente”);
e=in.readLine();
int y=Integer.parseInt(e);
}//fim do main
public static int expo(int base,int expoente){
if(expoente==0)
return 1;
else
if(expoente==1)
return base;
else
return base * expo(base,expoente-1);
}//fim expo
}//fim de potencia[/code]
Só para comparar,o mesmo exemplo em Haskell:
expo :: Int->Int->Int
expo b e
| e == 0 = 1
| e == 1 = b
| otherwise = b * expo b(e-1)
somente soma e subtração? não pode usar deslocamento (shifts) e operadores lógicos?
com isso é trivial implementar multiplicação e depois exponenciação.
multiplicação de 16 bits:
short mul(short a, short b) {
short r = 0;
for(int i = 0 ; i < 16; ++i)
if((b >> i) & 0x1 == 1) r += a << i;
//ou r += (a << i) & 0 - ((b >> i) & 0x1);
return r;
}
short exp(short x, short e) {
short r = 1;
while(e-- > 0)
r = mul(r, x);
return r;
}
porem se voce pode utilizar somente soma tua função mul ficaria:
short mul(short a, short b) {
short r = 0;
while(b-- > 0) r += a;
return r;
}
Ay,Caramba!Agora q eu li q não era pra usar nenhuma multiplicação!
Pensei q era só pra fazer recursivamente…foi malz,guscoppi
Tô mexendo com Haskell D+…
[quote=“Ironlynx”]Ay,Caramba!Agora q eu li q não era pra usar nenhuma multiplicação!
Pensei q era só pra fazer recursivamente…foi malz,guscoppi
Tô mexendo com Haskell D+…[/quote]
Andei lendo o site do Haskell e achei muito interessante…
Quanto tempo você demorou ± pra “pegar o esquema” da programação funcional??
Vegetto,se vc tiver tempo,em 1 semana vc aprende(…),vc deve se lembrar para q vc precisará dele…a facilidade de se treinar Haskell é q dificilmente o código ficará “Grande” digamos assim…o seu trabalho maior eh pensar recursivamente,o q a maioria não está acostumada a fazer(Ateh pq não precisa…).
[quote=“Ironlynx”]Ae louds,em scheme os operadores são pré-fixados?
Isso me faz lembrar as aulas de Estrutura de Dados I e Prolog…[/quote]
Sim, por ser uma linguagem derivada do lisp você tem toneladas de parenteses e notação prefixada. A maravilha disso é que toda sintaxe da linguagem pode se explicada em 2 minutos, alguem conhece alguma outra linguagêm que te permite isso? hehehehe
Bom acho q Haskell não fica atrás em matéria de simplicidade,mas como usa e abusa de recursividade,não eh para todas as necessidades…
Desculpe a ignorância,o que eh lisp?O mais underground de programação q aprendi foi prolog e Haskell mesmo!
Lisp é uma linguagem funcional baseada em listas…
O auto cad por exemplo, vc pode usar o auto lisp, que é uma variação do mesmo (isso, se não me falha a memória)
É uma linguagem muito legal, onde vc pode fazer umas coisas muito loucas, um exemplo disso é passar uma função como parâmetro de outra… :shock:
Além disso, ela é muito boa para trabalhar com recursividade…
Até os operadores matemáticos são funções, por exemplo para somar 6 números é mais ou menos isso:
(+ 1 2 3 4 5 6)
Legal né!!!
Existe ainda o scheme, que é uma variação muito usada em faculdades (não lembro se americanas ou européias) para os cursos de informática e o common Lisp que é usado mais profissionalmente!!!
Uma definição de fatorial seria mais ou menos o seguinte:
(defun fatorial (x)
(if (equal x 1)
1
(* x (fatorial (- x 1))))
E por ai vai!!!
Vou ver se acho um link de um livro em pdf sobre lisp que eu devo ter em algum lugar!!!
Scheme é a versão para meros mortais de lisp. LISP é a precursora das linguagens funcionais, que por sua vez são baseadas no principio do cálculo lambda, que data da mesma época da máquina do Alan Turing.
A principal diferença entre linguagens funcionais e imperativas é fato de código e dados serem a mesma coisa no primeiro caso.
Põe off nisso,mas já viu onde Java se encaixa entre as imperativas e funcionais…?Em nenhuma!Eh engraçado,mas ela eh considerada out-off da lista pq eh considerada mais do q linguagem!Tecnologia JAVA.Muitos relutam ateh em chama-lá de linguagem OO(como c++).Seria Tecnologia Orientada a Objetos?Java rulezzzzz
Cv,dos aspectos principais só esqueceste do uso FORTE da recursão como substituto da ITERAÇÂO(Falo por Haskell,q eh a q eu sei… ).
Bom qto ao Java…no words(…).Mas que ela escapou do campo de linguagem de programação escapou(tô falando sem sectarismo)… já tô ouvindo a “lenda” até q a Macromidia reformulou o Flash(Com a nova especificação ActionScript 2.0),para q ficasse mais claro a api para programadores substituirem front-end Swing p/Flash…se é verdade ou não eu não sei,mas bem q ela tah olhando com carinho pra comunidade JCP tah…
Cv
Para os puristas de linguagens funcionais, acredite ou não, list/scheme não são linguagens verdadeiramente funcionais! Isso se da ao fato que em uma linguagem puramente funcional, como ML, você não altera o valor vinculado a um nome depois de declarado.
Existem dois outros recursos muito legais que eu gosto de linguagens funcionais: lazy evaluation e continuations.