Ha encontrado una máquina que, cuando se alimenta con dos números sye, produce un código extraño que consta de las letras ay b. La máquina parece estar usando el siguiente algoritmo.

  1. Verifique si s es menor que e - 1. Si es así, continúe con el paso 2. Si no, salga.
  2. Incrementar s en 1
  3. Disminuya e por 1
  4. Si esta es la primera letra que está produciendo, produzca a. De lo contrario, produzca una letra diferente de la que produjo por última vez (solo se pueden producir ayb)
  5. vaya al paso 1.

Mira a continuación lo que probé

def strangeCode(s, e):
    output = ""

    if s < e-1:
        s = s+1
        e = e-1
        if len(output) % 2:
            output = output+"b"
        else:
            output = output+"a"
        return strangeCode(s,e)
    return output

Según tengo entendido, cuando devuelvo el código extraño (s, e), mi salida se convierte nuevamente en una cadena vacía, y aquí es donde estoy atascado.

Ejemplos de entradas y salidas son

Entrada: s: 4 e: 8

Salida: "ab"

2
David L 11 oct. 2019 a las 13:37

3 respuestas

La mejor respuesta

Es posible que desee pasar la salida como parámetro en cada iteración recursiva como esta:

def strangeCode(s, e, output=""):
    if s < e - 1:
        s = s + 1
        e = e - 1
        if len(output) % 2:
            output = output + "b"
        else:
            output = output + "a"
        return strangeCode(s, e, output)
    return output

Así que eso

print(strangeCode(4, 10))

Salida esto:

aba

Nota IMPORTANTE

Python no optimiza la recursividad de la cola (compruebe esto) , siempre debes hacer algoritmos iterativos. Esta es una solución alternativa:

def strangeCodeIterative(s, e):
    output = ""
    while(True):
        if s > e - 1:
            break

        s = s + 1
        e = e - 1
        if len(output) % 2:
            output = output + "b"
        else:
            output = output + "a"
    return output
2
ShadowRanger 11 oct. 2019 a las 11:08

output = "" está reinicializando la variable output en cada llamada a función, por lo que len (output) siempre se evaluará a 0. Creo que, con su enfoque, debe entregar la salida como un parámetro para la llamada a la función como strangeCode(s,e,output) y elimine el output = ""

1
Boketto 11 oct. 2019 a las 10:47

Está utilizando un enfoque funcional ya que ha elegido la recursión sobre la iteración. En la programación funcional, la siguiente solución se llama recursión de cola.

    def strangeCode(s, e, output = ""):
        if s < e-1:
            s = s+1
            e = e-1
            if len(output) % 2:
                output = output+"b"
            else:
                output = output+"a"
            return strangeCode(s,e,output)
        return output


    strangeCode(4,8,output = "")

En caso de que solo necesite estrictamente "s" y "e" como argumentos, puede usar un contenedor de funciones:

def strangeCode(s, e):
    def _inner(s,e,output=""):
        if s < e-1:
            s = s+1
            e=e-1
            if len(output) % 2:
                output = output+"b"
            else:
                output = output+"a"
            return _inner(s,e,output=output)
        return output
    return _inner(s,e,output="")
0
Konstantinos Katsantonis 11 oct. 2019 a las 10:57
58339470