Python - Una duda breve.

   
Vista:

Una duda breve.

Publicado por Sergio (2 intervenciones) el 14/12/2014 22:19:49
Buenas! Mi problema es el siguiente: no entiendo el resultado de estas funciones que deberian hacer lo mismo

Con el bucle while:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def autosuma(n):
	while n != 10:
		n = n + 1
		print n
	if n == 10:
		return
 
 
>>> autosuma(1)  #RESULTADO
2
3
4
5
6
7
8
9
10

Con condiciones:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def autosuma(n):
          if n != 10:
 	       n = n + 1
	       autosuma(n)
 	       print n
	  elif n == 10:
	       return
 
 
>>> autosuma(1)  #RESULTADO
10
9
8
7
6
5
4
3
2

No entiendo la diferencia, no encuentro un caso donde use un while y no pudiera hacerlo tamibien mediante condiciones, y sobretodo, no entiendo por que el resultado está en orden contrario en los dos casos. El resultado que esperaba era el de la funcion con while en ambos casos.

Muchisimas gracias! Un saludo!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Cristofer

Una duda breve.

Publicado por Cristofer (34 intervenciones) el 15/12/2014 05:49:06
Hola aquí tienes las explicaciones...

Para el while:

En el primero el problema esta en que sumas +1 a la variable y después muestras el resultado por lo tanto si el usuario coloca por ejemplo 1 el programa sumara 1 y mostrara el resultado... podrías arreglar esto mostrando lo que contiene la variable n y luego proceder a sumarle 1
como dato, puedes sumarle un valor a una variable usando esto:

1
n += 1

Para el If:

hacer que una función se llame así misma no es un buen recurso, debes intentar realizar algoritmos buscando la forma de evitar esto.

no me es posible explicar por que ocurre esto, lo entiendo y después de romperme la cabeza como media hora di del por que ocurre esto, pero para explicártelo deveria explayarme demasiado y quizás ni entiendas no soy muy bueno explicando.

Te explicare si por que la secuencia comienza con el 10 de hay piensa tu del por que continua hacia atrás...

se entra a la función con n = 1 <--------------- Primera llamada a la función
se comprueba que n sea distinto que 10, verdadero
se le suma 1 a n dejando a n como 2
se vuelve a entrar a la función con n = 2 <--------------- Segunda llamada a la función
se comprueba que n sea distinto que 10, verdadero
se le suma 1 a n dejando a n como 3
se entra a la función con n = 3 <--------------- Tercera llamada a la función

... (Importante notar que hasta ahora no se se a ejecutado print n)

se le suma 1 a n dejando a n como 9
se entra a la función con n = 9 <--------------- Novena llamada a la función
se comprueba que n sea distinto que 10, verdadero
se le suma 1 a n dejando a n como 10
se entra a la función con n = 10 <--------------- Décima llamada a la función
se comprueba que n sea distinto que 10, falso
se comprueba que n sea igual a 10, verdadero
se retorna nada
termina la ejecución de la décima llama a la función dejando a n = 10
se ejecuta print n imprimiendo 10
1
# a partir de ahora quizás no lo entiendas.
termina la ejecución del la novena llamada a la función dejando a n = 9

esto ocurre por que la novena función recibió a n como un 8 y esta le sumo 1 dejando a n = 9 para la novena llamada a la función n = 9 solo para la décima llamada vale 10, y así mismo para las demás, la octava llamada a la función recibió un 7 al cual le sumo 1 y quedo como 8 por lo tanto para la octava llamada a la función n vale 8 y así hasta que termina la ejecución de todas las llamadas, no se imprime 1 por que para la primera llamada a la función al recibir el 1 le suma 1 y por lo tanto para la primera llamada n vale 2... es básicamente el mismo error que en el while.

ummm... recuerdo que dije que no lo iba a explicar todo xD bueno... quizás alguien me entienda T_T
fue un excelente ejercicio para mi conseguir comprender ese if :D

sobre tu pregunto de por que usar while si con condiciones se puede hacer exactamente lo mismo, pues estas mal una condición no puede hacer lo que hace un while, en el ejemplo tu usas una condición Y UNA FUNCIÓN sin esa función el IF no podría hacer lo que hace el while, while funciona por si mismo y por lo tanto ahorra unas cuantas lineas de código, ademas while tiene muchas otras utilidades como el control de excepciones (bloques try y except) ademas de permitir romper el ciclo con un simple break, while es mucho mas optimo para actividades repetitivas por que para eso fue concebido IF fue diseñado para otra cosa.... en la vida real puedes usar una Play Station 4 para golpear gente y es muy util quizas lastimes bastante a la otra persona, pero no fue echa para eso, existen armas para golpear a la gente mucho mas funcionales que una Play Station no crees ? (Analogias :D)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de xve

Una duda breve.

Publicado por xve (1229 intervenciones) el 15/12/2014 08:48:10
Muy buena la explicación la de Cristofer!!!!

Mi explicación, es que en el segundo código utilizas una función recursiva, que se va llamando a si misma, y luego muestra el resultado.
Si muestras el resultado, antes de llamar a la función te lo mostrará igual.

1
2
3
4
5
6
7
8
9
def autosuma(n):
	if n != 10:
		n = n + 1
		print n
		autosuma(n)
	elif n == 10:
		return
 
autosuma(1)

Espero que te sirva...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Una duda breve.

Publicado por Sergio (2 intervenciones) el 15/12/2014 11:39:26
De nuevo muchisímas gracias a ambos, me ha sido muy útil tu respuesta Cristofer, te agradezco enormemente lo detallada que está tu respuesta, espero no haberte quitado demasiado tiempo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Una duda breve.

Publicado por jose antonio zapatero (4 intervenciones) el 18/12/2014 09:58:56
Buenas Sergio,
Estoy buscando gente para crear red social en phyton, que te parece el proyecto,
Te gustaria colaborar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar