Mi programa no funciona.

Está destinado a ser

  • tienes una matriz y un código
  • si el código es 0 entonces tienes que sumar los números
  • Si es algo más, tienes que multiplicarlas.
  • Quiero que use la recursividad, pero cuando llegas a menos de 5 números, entonces no uso más recursividad, solo quiero hacerlo normalmente

Este es el problema que tengo

    the_rest = sum_or_product(code, array[1:])
UnboundLocalError: local variable 'sum_or_product' referenced before assignment

Este es el programa

def sum_or_product(code, array):

    if code == 0:
        do = 'SUM'
    else:
        do = 'PRODUCT'

    # THIS IS WITH THE RECURSION

    if len(array) >= 5:
        this_one = array[0]
        the_rest = sum_or_product(code, array[1:])
        if do == 'SUM':
            return this_one + the_rest
        if do == 'PRODUCT':
            return this_one * the_rest

    # THIS IS WITHOUT THE RECURSION

    if do == 'SUM':
        start = 0

    if do == 'PRODUCT':
        start = 1

    sofar = start

    for i in array:
        if do == 'SUM':
            total = sofar + i
            sofar = total
        if do == 'PRODUCT':
            product = sofar * i
            sofar = product
    sum_or_product = sofar

    return sum_or_product


print(sum_or_product(1, [1,2,3,4,5,6,7,8,9,10]))

Debería multiplicar todos los números del 1 al 10. Pero solo da un error.

-1
user14068348 8 ago. 2020 a las 14:29

2 respuestas

La mejor respuesta

Para devolver un valor de una función, simplemente

return <value>

En lugar de asignar el valor a la función.

Entonces, para arreglar su código, solo necesita reemplazar

    sum_or_product = sofar

    return sum_or_product

Con

    return sofar

Como nota al margen, en lugar de usar convenciones oscuras como '0 es SUMA, 1 es PRODUCTO', use constantes, por ejemplo:

OP_SUM=0
OP_PRODUCT=1

def sum_or_product(operation, array):

...

    if operation == OP_SUM:
        ...
    elif operation == OP_PRODUCT:
        ...

...

print(sum_or_product(OP_SUM, [2, 3]))
0
Marcello Romani 8 ago. 2020 a las 12:15
    def sum_or_product(code, array):
    
        return (([code * num for num in array if code != 0 and num <= 5]), ([code + num for num in array if num > 5]))
 print(sum_or_product(2, [1,2,3,4,5,6,7,8,9,10]))

Salida

([2, 4, 6, 8, 10], [8, 9, 10, 11, 12])
0
Cyber-Tech 8 ago. 2020 a las 11:59