[C con Clase] Método recursivo en árbol que retorna valor de verdad

User usuarioanonimomysql en gmail.com
Lun Mar 17 17:10:44 CET 2014


Hola,

Refloto este tema pues no me quedó claro en su día, ¿podrías hacer los
cambios pertinentes a la función "bool myClass::existsBlue()" para que
pueda ver cómo queda?

Muchas gracias,

Saludos.


El 12 de septiembre de 2012, 8:30, User <usuarioanonimomysql en gmail.com>escribió:

> Hola Pedro,
>
> En la implementación que has puesto veo un problema, si en el método no se
> ejecuta el bucle while porque no existe un siguiente hijo, entonces el
> valor de retorno no estará definido.
>
> Saludos.
>
> El 12 de septiembre de 2012 08:21, User <usuarioanonimomysql en gmail.com>escribió:
>
> Gracias a los dos.
>>
>> Steven, ¿podrías poner la implementación completa del método?
>>
>> Muchas gracias.
>>
>> El 11 de septiembre de 2012 18:36, Steven Davidson <srd4121 en njit.edu>escribió:
>>
>> Hola User,
>>>
>>>
>>> On 9/11/2012 11:32 AM, User wrote:
>>>
>>>> Hola,
>>>>
>>>> Estoy tratando de hacer un método recursivo que recorra un árbol y
>>>> retorne el valor de verdad 'true' si al menos hay un nodo en ese
>>>> árbol que tenga la propiedad azul (blue). No he sido capaz de hacerlo
>>>> de otra manera que no fuera utilizando un miembro de clase, el
>>>> m_hasBlue. Me gustaría poder implementar este método sin necesidad de
>>>> recurir a un miembro de clase. ¿Me echáis una mano?
>>>>
>>>> Este es mi código:
>>>>
>>>> bool myClass::existsBlue()
>>>> {
>>>>    myClass *object = 0;
>>>>    while(m_children.next())
>>>> {
>>>> object =  m_children.first();
>>>> if (object && object->isBlue())
>>>> {
>>>> m_hasBlue = true;
>>>> break;
>>>> }
>>>> else
>>>> {
>>>> m_hasBlue = object->existsBlue();
>>>> }
>>>> }
>>>> return m_hasBlue;
>>>> }
>>>>
>>>>
>>> La verdad es que vas por buen camino. Si no quieres usar un dato
>>> miembro, entonces pásalo a este ámbito local de la función recursiva. Por
>>> ejemplo,
>>>
>>> bool myClass::existsBlue()
>>> {
>>>   bool bEsAzul = false;
>>>
>>>   myClass *object = 0;
>>>   while( m_children.next() )
>>>   ...
>>> }
>>>
>>> Aquí usaríamos 'bEsAzul' en lugar de 'm_hasBlue'.
>>>
>>> El único problema que veo es que no terminas el bucle 'while' en cuanto
>>> hayas encontrado "azul". Esto se puede corregir en la condición del bucle
>>> así,
>>>
>>> bool myClass::existsBlue()
>>> {
>>>   bool bEsAzul = false;
>>>
>>>   myClass *object = 0;
>>>   while( !bEsAzul && m_children.next() )
>>>   ...
>>> }
>>>
>>> que se leería: "mientras que no sea azul y el siguiente hijo exista, haz
>>> ...".
>>>
>>> Podríamos optimizar un poco más el código eliminando el uso de 'break',
>>> que no lo recomiendo para salir de los bucles. De hecho, podemos eliminar
>>> el uso de 'bEsAzul' y retornar de inmediato en cuanto sepamos si es azul o
>>> no.
>>>
>>> Otra alternativa es tratando la información en el árbol como una lista
>>> (o array), para recorrerla linealmente en busca de "azul". El recorrido
>>> puede ser iterativa o recursiva.
>>>
>>>
>>> Espero que esto te ayude.
>>>
>>> Steven
>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> Lista de correo Cconclase Cconclase en listas.conclase.net
>>> http://listas.conclase.net/mailman/listinfo/cconclase_
>>> listas.conclase.net
>>> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>>>
>>
>>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20140317/d2d03a59/attachment.html>


Más información sobre la lista de distribución Cconclase