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:
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
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)