Duda visual Basic

B

Hola a todos, buenooo pos estoy aprendiendo a programar... y me he propuesto hacer un programa que sake el factorial del número que el usuario introduzca.

Supongo que la forma macarrona de hacerlo, por ejemplo es poner:

Sub Factorial()
Dim res As String

res = InputBox("Introduzca un número del 1 al 10 para sacar su factorial")
If (res = 10) Then
MsgBox (res * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1)
End If

If (res = 9) Then
MsgBox (res * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1)
End If

If (res = 8) Then
MsgBox (res * 7 * 6 * 5 * 4 * 3 * 2 * 1)
End If

If (res = 7) Then
MsgBox (res * 6 * 5 * 4 * 3 * 2 * 1)
End If

If (res = 6) Then
MsgBox (res * 5 * 4 * 3 * 2 * 1)
End If

If (res = 5) Then
MsgBox (res * 4 * 3 * 2 * 1)
End If

If (res = 4) Then
MsgBox (res * 3 * 2 * 1)
End If

If (res = 3) Then
MsgBox (res * 2 * 1)
End If

If (res = 2) Then
MsgBox (res * 1)
End If

If (res = 1) Then
MsgBox (res * 1)
End If

End Sub

Pero por ejemplo, si kiero sacar el factorial de 765... no voy a estar metiendo código como arriba hasta el 765..., existe alguna funcion para evitarme poner la multiplicación del número que el usuario introduzca en el "InputBox" por los números menores a este?

gracias

Guardian

Yo recuerdo que para calcular el factorial de un número, usaba funciones recursivas para no tener que hacer eso de los if, mete el cálculo en un while numero > 0 y haz llama a la misma función dentro del bucle.

Creo, si entendí bien, es lo que pedías.

CeSaRe

Te lo he puesto en el hilo de cs.

B

yo esk.. acabo de empezar hoy cn el VB y ando to loko jaja xD no se si esperar a mañana corregir el ejercicio xD

CeSaRe

Espera a corregirlo mañana y cuando la profesora pregunte... alguien lo sabría mejorar ? Tú contestas firme... "sí, yo podría, con una función recursiva". Aunque no sepas lo que es, la admiración y el respeto de tu profesor y compañeros no tiene precio.

P.D.: si te piden que lo expliques, le recriminas al profesor que si él no lo sabe o no lo quiere explicar él y que para qué le pagan si no. Fotografía el momento o grávalo con el móvil y lo subes a youtube, verás que risas. xD

B

de todas maneras dime q es un funcion recursiva por si me pregunta plis weno ara lo miro en google xD

Dod-Evers

Joer, quién te ha enseñado a programar?

Has pensado antes de hacer el ejercicio?

función factorial (int n) return res
if n=1 then
return res
else
return n*factorial(n-1);

Una función recursiva es aquella que se llama a sí misma.

PD: Joeer, es que cada vez que lo veo me sangran los ojos... vaya aberración.

B

llevo dos dias dando programacion de nivel de grado medio... y segun la profe lo q kiere es q pensemos... asi q si no me explikan mu bien y solo kieren q piense.. pos al final me rayo cm humano q soy xD

B

lo mejor será esperar a mañana, gracias por la ayuda

kas

Si llevas 2 dias de programacion, a no ser que hayas hecho 2h cada dia ese problema aun te queda un poco lejos.

Hay 2 maneras de solucionar ese problema:

1) Como te han dicho, usando la recursividad. Deves tener en cuenta que para entender la recursividad antes hay que enteder lo que es la recursividad.

2) El segundo es hacer lo mismo con un bucle. Toda funcion recursiva se puede pasar a bucle y ademas es demostrable matematicamente (por inducción).

En realidad la primera forma es mas "smart" y la segunda mas "eficaz".

Dim resultado As Integer = 1
For(i as integer = 2 to n)
    resultado = resultado * i
End For
MTX_Anubis

una función recursiva es una función que se llama así misma

factorial de n es:

n(n-1)(n-2)...2*1

eso quiere decir que

!n=n*!(n-1)

O sea, factorial de 'n' es igual a 'n' por el factorial de (n-1). De esta manera ya usaríamos recursividad. Además eso es igual a:

!n=n(n-1)!(n-2)

y así se alarga hasta que te quedaras con el caso base que sería !1 o !0, que es 1 en ambos.

Pues simplemente es llevar esa función a VB xD que te la pondría si me acordara de VB pero la última vez que lo toqué fue hace 8 o 9 años así que no puedo ayudarte pero bueno, #7 y #10 ya te han escrito la dos maneras de hacerlo :P

Khanser

Pero tal y como lo planteó el problema, este hombre parece que todavia no ha hecho nada de funciones, asi que seria mejor darselo en un bucle (VB me keda muy lejos, no me acuerdo como era la sintaxis)

bLaKnI

Bucle FOR y no te compliques la vida.

B

Option Explicit
Sub prueba()
Dim res As Integer
res = InputBox("introduce un numero")
factorial (res)
End Sub
Function factorial(m As Integer) As Integer
Dim n, f, i As Integer
n = m
If n > 0 Then
f = 1
For i = 1 To n
f = f * i
Next i
Else
f = 1
End If
factorial = f
End Function

esa es una de las posibles soluciones :D

TaMy

Dim res As Integer = 1
Dim num As Integer = InputBox("Introduzca un número del 1 al 10 para sacar su factorial")
while num > 0
res = res * num
num = num-1
end while

Por si quieres usar un while

Si lo quieres recursivo (pero es algo a evitar):

function factorial(ByVal n As Integer) As Integer
if n < 1 then
return 1
else
return n*factorial(n-1)
end if
end function

Tu llamas a esa funcion y te devuelve su factorial... pero usar recursividad es malo...

MTX_Anubis

#15 el if debería ir con =, se te ha pirado x)

La recursividad no tiene por qué ser mala, depende del tipo de problema que tengas :P. Obviamente en factoriales, multiplicaciones, sumas, fibonacci y demás es absurdo, sobre todo cuando devuelven varias llamadas a la vez, eso es catastrófico xD

Usuarios habituales