Autor Tema: Múltiplos de 7 con recursión en Python

0 Usuarios y 1 Visitante están viendo este tema.

23 Junio, 2020, 01:40 am
Respuesta #10

ingmarov

  • Moderador Global
  • Mensajes: 5,424
  • País: hn
  • Karma: +0/-0
  • Sexo: Masculino

Es verdad, debe dar error, porque para 38 se tiene
resta=-13

Y.  -13%10=7 por lo que para el primer bloque if la condición propuesta es verdadera. Cuando deseamos que sea falsa.

Gracias, Ingmarov; todavía tengo que pensar del todo cómo funciona la línea del if resta%100!=resta, pero lo dejo para mañana, que ahora estoy un poco dormido (y, si no, ya me lo explicas un poco).

Te explico, la intensión de esa línea es terminar la sucesión de restas, y nos garantiza que está resta sea menor que cien, valores para los cuales creo es fácil saber si son múltiplos de siete o no. Mientras resta sea distinta (mayor) que resta%100 se repetirá el llamado a la función.
Por desgracia, el programa no funciona para todos los casos.

Quizás si cambiamos, en esa línea, != por <, se corrija el error.


En mi código, sí, el error que manda está relacionado con el int y no sé qué más de la base 10, según informa. Pero éste error se produce por una razón entendible: el valor “n” en el bucle interno de la función va siendo cada vez menor hasta que llega a un primer número que ya tiene una sola cifra (un carácter en la cadena); si ese número no es 0,7 ó -7, el bucle no se para, sigue y al llegar aquí ( s[:-1]) no extrae el carácter de la izquierda, porque no existe, no está definido; de ahí que produzca el fallo al intentar convertirlo en int. El que está definido, en caso de un sólo carácter en la cadena, es el de la derecha s[-1:]. En caso de que el número fuera negativo, la cadena tiene dos caracteres, con lo cual intenta convertir a entero el signo “-” y entonces da error también; concretamente indica el signo menos al final:

ValueError: invalid literal for int() with base 10: '-'

Sí, me costó un poco darme cuenta.

También había pensado utilizar str() e int() como lo has hecho... Me pregunto si la máquina trabaja más o menos usando texto. Aunque para un programa tan pequeño, esa diferencia de trabajo no es perceptible, ni creo tenga mucha importancia.

Saludos sempai

No te confíes, revisa lo que escribo. Yo también me equivoco.
Odio el autocorrector de Android...

23 Junio, 2020, 08:45 am
Respuesta #11

feriva

  • $$\Large \color{#a53f54}\pi\,\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 11,325
  • País: es
  • Karma: +1/-0
  • Sexo: Masculino

Te explico, la intensión de esa línea es terminar la sucesión de restas, y nos garantiza que está resta sea menor que cien, valores para los cuales creo es fácil saber si son múltiplos de siete o no. Mientras resta sea distinta (mayor) que resta%100 se repetirá el llamado a la función.
Por desgracia, el programa no funciona para todos los casos.

Quizás si cambiamos, en esa línea, != por <, se corrija el error.


Ah, que es que no me había dado cuenta de que pones que hay que meter números mayores que cien; no había visto la última línea porque tengo la pantalla con una letra muy grande y había que bajar la barra de scroll.

Citar
También había pensado utilizar str() e int() como lo has hecho... Me pregunto si la máquina trabaja más o menos usando texto. Aunque para un programa tan pequeño, esa diferencia de trabajo no es perceptible, ni creo tenga mucha importancia.
Saludos sempai

Sí, puede con números muy grandes para manipular cadenas; yo lo he usado con los RSA, con algunos de más de 200 cifras, para obtener cada uno de los dígitos y convertirlos a int, por ejemplo.

Muchas gracias por la aclaración, Ingmarov.

Saludos.

24 Junio, 2020, 12:06 am
Respuesta #12

gorkam

  • $$\Large \color{#5372a0}\pi\,\pi$$
  • Mensajes: 50
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
Ya he conseguido solucionar el problema. Muchas gracias a todos, vuestros mensajes han sido de gran utilidad. Muchas gracias.

24 Junio, 2020, 02:05 am
Respuesta #13

ingmarov

  • Moderador Global
  • Mensajes: 5,424
  • País: hn
  • Karma: +0/-0
  • Sexo: Masculino
Ya he conseguido solucionar el problema. Muchas gracias a todos, vuestros mensajes han sido de gran utilidad. Muchas gracias.

Compártenos tu código, así aprendemos todos.

Saludos
No te confíes, revisa lo que escribo. Yo también me equivoco.
Odio el autocorrector de Android...

25 Junio, 2020, 01:48 pm
Respuesta #14

gorkam

  • $$\Large \color{#5372a0}\pi\,\pi$$
  • Mensajes: 50
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
Aquí dejo el código. Mi código se ajusta a lo que me pide mi enunciado.
Código: [Seleccionar]
def div7rec(n):
    if cantidadDigitosRec(n) <= 2:
        return (n%7==0)
    else:
        return div7rec((n//10) - ((n%10*2)))

def cantidadDigitosRec(n):
    if (n<10):
        return 1
    else:
        return 1+cantidadDigitosRec(n//10)


Gracias a todos. Saludos.