Desafio - Cálculo de potência sem o "expt"!

Mais um da série desafios...

Moderador: Moderadores

Responder
Avatar do usuário
admin
Administrador
Administrador
Mensagens: 621
Registrado em: Sex 28 Nov 2003 11:00:00 pm
Localização: Itu / SP
Contato:

Desafio - Cálculo de potência sem o "expt"!

Mensagem por admin »

Em autolisp temos a função "expt" para cálculos de potência

2 elevado à 2 = 4

[lsp](expt 2 2) ; retorna 4[/lsp]
[lsp](expt 3 2) ; retorna 9[/lsp]

E se não existisse esta função? como resolveriamos o problema?
Teriamos que criar uma função que recebesse qualquer dupla de valores e retornasse o resultado
exemplo:

[lsp](potencia 10 4) ; deve retornar 10000[/lsp]

da mesma forma que utilizamos:

[lsp](expt 10 4); retorna 10000[/lsp]


Alguem se habilita? Resposta amanhã se ninguem conseguir!
Marcos Mendes de Almeida
mmalbr@gmail.com
Avatar do usuário
ederson
Prata 1/3
Prata 1/3
Mensagens: 414
Registrado em: Qua 21 Jul 2004 12:00:00 am
Localização: Belo Horizonte

Mensagem por ederson »

Marcos, tabajara para expente inteiro. Para expoente fracionário, precisa desenvolver, para encotrar os inteiros que geram a fração.
[lsp](defun c:potencia (/ base expo resu)
(setq base (getreal "\nEntre com a base...")
expo (getint "\nEntre com o expoente...")
resu base
)
(repeat (1- expo)
(setq resu (* resu base))
)
(print (rtos resu))
(princ)
)[/lsp]
Ederson Ambrosio
031 8893-2947
BH-MG
Avatar do usuário
admin
Administrador
Administrador
Mensagens: 621
Registrado em: Sex 28 Nov 2003 11:00:00 pm
Localização: Itu / SP
Contato:

Mensagem por admin »

Ok... Perfeito.. Mas vamos complicar um pouco mais!


não pode utilizar as funções while nem repeat

Depois vão entender onde quero chegar!

A dica está justamente em não poder utilizar while e repeat

aguardo

at
Marcos Mendes de Almeida
mmalbr@gmail.com
Avatar do usuário
nuelss
Bronze 3/3
Bronze 3/3
Mensagens: 386
Registrado em: Qui 05 Ago 2004 12:00:00 am
Localização: São Simão - SP

Mensagem por nuelss »

:)

Boa tarde senhores !!!

Ando meio sumido ...

Segue uma possivel solução - tá meia feinha ... e está dando erro de stacks quando liberada para numeros decimais ... Só ta funcionando com inteiros ... se alguem puder melhorar ... é que fiz correndo, agora no almoço ...

[lsp](defun pot (base expo)
(if (or (null base) (null expo) (null (numberp base)) (null (numberp expo)) (null (equal (fix base) base)) (null (equal (fix expo) expo)))
nil
(progn
(if (null expon)
(setq basen base expon (- expo 1))
)
(if (> expon 0)
(progn
(setq basen (* base basen) expon (- expon 1))
)
)
(if (equal expon 0)
(progn
(setq expon nil base nil expo nil)
basen
)
(pot base expon) ;|Recursãozinha|;
)
)
)
)[/lsp]

Sintaxe:
[lsp](setq valor (pot base expoente))[/lsp]

Flw ...
"É a verdade o que assombra, o descaso que condena,
a estupidez o que destrói eu vejo tudo que se foi e que
não existe mais" (Metal Contra as Nuvens - Legião Urbana)

Abraço,
Emanuel 8)
Avatar do usuário
ederson
Prata 1/3
Prata 1/3
Mensagens: 414
Registrado em: Qua 21 Jul 2004 12:00:00 am
Localização: Belo Horizonte

Mensagem por ederson »

Havia ficado + difícil, mas acho que é isso mesmo...

[lsp](defun potenciaII (base expo)
(if (equal expo 0)
(setq resu 1)
(setq resu (* base (potenciar base (- expo 1))))
)
(print resu)
(princ)
)[/lsp]

(potenciaII 8 3)
Ederson Ambrosio
031 8893-2947
BH-MG
Avatar do usuário
ederson
Prata 1/3
Prata 1/3
Mensagens: 414
Registrado em: Qua 21 Jul 2004 12:00:00 am
Localização: Belo Horizonte

Mensagem por ederson »

[lsp](defun potenciaII (base expo)
(if (equal expo 0)
1
(* base (potenciaII base (1- expo)))
)
)[/lsp]

Agora tá certo!
Ederson Ambrosio
031 8893-2947
BH-MG
Avatar do usuário
neyton
Master
Master
Mensagens: 1668
Registrado em: Qui 25 Dez 2003 11:00:00 pm
Contato:

Mensagem por neyton »

dica:
usem recursivide e um if....
como que usa o html daqui?
visite o meu blog: http://tbn2.blogspot.com
lisps exclusivas pra download!!
Avatar do usuário
admin
Administrador
Administrador
Mensagens: 621
Registrado em: Sex 28 Nov 2003 11:00:00 pm
Localização: Itu / SP
Contato:

Mensagem por admin »

O ederson conseguiu

parabens! he he he he
segue a minha versão:

[lsp]
(defun Expoente (x y)
(IF (zerop y)
1
(* x (Expoente x (- y 1)))
)
)[/lsp]

Realmente o segredo esta em usar recursividade onde a rotina chama ela mesma de forma controlada para não criar um loop infinito!
Marcos Mendes de Almeida
mmalbr@gmail.com
Responder