usando sintaxis resueltos reglas recursividad recursiva programacion pilas logica informatica ejercicios python recursion

sintaxis - Entero a base-x sistema usando recursión en python



reglas de recursividad (4)

La función de convert devuelve None, y print imprime. Debe eliminar la llamada print o acumular el resultado como una cadena y devolverlo.

(Supongo que la llamada a la base realidad es una llamada recursiva para convert ).

Intento escribir un código recursivo que pueda convertir un número a cualquier sistema base. por ejemplo, el número entero 10 en binario se convertiría en 1010

Hasta ahora tengo esto, pero estoy teniendo "Ninguno" entre mi producción. ¿Alguien puede ayudarme con mi código?

def convert(a,b): add = a%b if a<=1: return a else: print(base(a//b,b), add)

mi idea es que a% b es el número que se agrega al final del número y a // b es la parte recursiva donde usa la respuesta del número binario anterior, por lo que 10 en la base 2 es solo convertir (5,2) y agregue el 0 al final, ya que a // b = 5 y a% b = 0, que = 1010


No tiene declaración de devolución en su bloque else, y no tiene una llamada recursiva para convert .

Creo que quieres:

if a<=1: return str(a) else: return str(convert(a//b,b)) + str(add)

como en

>>> def convert(a,b): ... add = a%b ... if a<=1: ... return str(a) ... else: ... return str(convert(a//b,b)) + str(add) ... >>> convert(10,2) ''1010''

En general, trate de evitar mezclar tipos en funciones recursivas. En la mayoría de los casos, tanto su caso base como su caso recursivo deben devolver el mismo tipo.


Te recomiendo que estructures tu código de una manera más precisa. Puede dividir la tarea especificada vagamente que menciona a lo largo de diferentes subtareas, por ejemplo:

  • determinar y normalizar los signos del número y la base (¿ necesita soportar bases negativas, o puede simplemente generar una excepción?), asegurando también que se genere una excepción inmediata en casos de error (por ejemplo, una base de 0 o 1 );
  • escriba una función que (proporcione valores positivos y correctos para a y b ) devuelva una "secuencia de dígitos" para representar a en la base b , donde un "dígito" es un número entero entre 0 incluido y b excluido;
  • escriba una función que, dado el signo de una y las expansiones de secuencia de dígitos crea y devuelve una representación de cadena, depende de cómo quiera representar "dígitos" muy grandes cuando b es grande, digamos> 36 si desea usar dígitos, luego Cartas ASCII, para los primeros 36 dígitos de la manera obvia; tal vez deberías aceptar una cadena "alfabética" para usar con este propósito (y la primera función anterior debería generar una excepción cuando b es demasiado grande para el alfabeto dado)
  • escriba una función que use todos los anteriores para imprimir la cadena

De estas tareas, solo la segunda puede verse como adecuada para una implementación "recursiva" si uno insiste (¡aunque una implementación iterativa es de hecho mucho más natural!), Dado que es una tarea, supongo que tendrá que hágalo recursivamente porque eso es parte de la tarea asignada, ¡ah bien! -). Pero, como referencia, una forma obvia de iterar sería:

def digitsequence(a, b): results = [] while True: results.append(a % b) if a < b: break a //= b return reversed(results)

asumiendo que uno quiere la secuencia de dígitos en el orden "big endian" a la que estamos acostumbrados por la forma en que la notación decimal posicional entró en la cultura occidental (fue el orden little-endian más calculado en el original árabe ... pero el árabe está siendo escrito de derecha a izquierda, la transcripción literal de esa orden en idiomas europeos, escrita de izquierda a derecha, se convirtió en big-endian! -).

De todos modos, puedes tomar la recursión lineal simple como una manera de "revertir" las cosas implícitamente (podrías decir que la recursividad "oculta" una pila de último en entrar, primero en salir, que es claramente una forma de invertir una secuencia ;-), que creo que es donde la especificación de recursión en la tarea puede venir de ;-).


Estoy trabajando en hacer un paquete de pip para esto.

Te recomiendo que uses mi base.py https://github.com/kamijoutouma/bases.py que fue inspirado por bases.js

from bases import Bases bases = Bases() bases.toBase16(200) // => ''c8'' bases.toBase(200, 16) // => ''c8'' bases.toBase62(99999) // => ''q0T'' bases.toBase(200, 62) // => ''q0T'' bases.toAlphabet(300, ''aAbBcC'') // => ''Abba'' bases.fromBase16(''c8'') // => 200 bases.fromBase(''c8'', 16) // => 200 bases.fromBase62(''q0T'') // => 99999 bases.fromBase(''q0T'', 62) // => 99999 bases.fromAlphabet(''Abba'', ''aAbBcC'') // => 300

consulte https://github.com/kamijoutouma/bases.py#known-basesalphabets para saber qué bases son utilizables

Para su pregunta particular

Si lo que buscas es ir binario y volver, puedes hacerlo

>>> from bases import Bases >>> bases = Bases() >>> bases.toBase(200,2) ''11001000'' >>> bases.fromBase(''11001000'',2) 200 >>> bases.toBase2(200) ''11001000'' >>> bases.fromBase2(''11001000'') 200

Que te diviertas !!!

Y de nuevo para obtener una lista de las bases utilizables con esta biblioteca, consulte https://github.com/kamijoutouma/bases.py#known-basesalphabets