Acerca de:

Este blog contiene los códigos, ejemplos y bases de datos que he usado cuando aprendía acerca de algún tema específico. En lugar de borrarlos (una vez dominado ya el tema), he decidido publicarlos :)

sábado, 18 de abril de 2015

Calculando los números de la serie Fibonacci de forma recursiva en Python 2.7

Una función que calcule los números de Fibonacci es el ejemplo clásico para aprender recursividad:

def fibs(x):
    if x <= 1:
        return x
    return fibs(x - 1) + fibs(x - 2)



Lo malo de esta función es que calcula un número de la serie Fibonacci específico, no calcula toda la serie hasta una cantidad determinada.

La siguiente función sí devuelve la lista de los números de Fibonacci hasta la cantidad de elementos en la lista que se le indique:

def fibList (x, limit):
    if len(x) < 2:
        return fibList([1, 2], limit)

    if len(x) > limit:
        return x

    h = x[-1] + x[-2]
    x.append(h)
    return fibList(x, limit)


La forma de llamarla es:

x = fibList([], 10)

for c in x:
    print(c)



El primer parámetro puede ser una lista vacía o los primeros valores de la serie:

x = fibList([1, 2], 10)

En ambos casos el resultado es:




La lista tiene 11 valores en lugar de 10 debido a que primero inserta el elemento con la función append y después evalúa el tamaño de la lista.

sábado, 11 de abril de 2015

Listar los archivo en una carpeta y sus subcarpetas de forma recursiva

Un día necesité listar los archivos existentes en una carpeta y sus subcarpetas. Como reto, quise implementar mi propia función y aquí está :D

Los algoritmos que recorrer árboles de directorios son recursivos, no se usan bucles debido a que el algoritmo ignora la profundidad que alcanzarán los subdirectorios en el árbol.

import os
from os import listdir
from os.path import isfile, isdir, join

def listdir_recurd(files_list, root, folder, checked_folders):

    if (folder != root):
        checked_folders.append(folder)

    for f in listdir(folder):

        d = join(folder, f)       

        if isdir(d) and d not in checked_folders:
            listdir_recurd(files_list, root, d, checked_folders)
        else:
            if isfile(d):  # si no hago esto, inserta en la lista el nombre de las carpetas ignoradas
                files_list.append(f)

    return files_list



La forma de usar esta función es:

if __name__ == "__main__":
    filez = listdir_recurd([], 'D:\Sample', 'D:\Sample', ['D:\\Sample\\Uno']) # esto omite la subcarpeta 'D:\\Sample\\Uno'

    filez = listdir_recurd([], 'D:\Sample', 'D:\Sample', ['D:\\Sample\\Uno', 'D:\\Sample\\Dos']) # esto omite la subcarpeta 'D:\\Sample\\Uno' y la subcarpeta 'D:\\Sample\\Dos'

    filez_ = listdir_recurd([], 'D:\Sample3', 'D:\Sample3', []) # esto no omite ninguna subcarpeta

La función recibe los siguientes parámetros:

"files_list": es el acumulador. Siempre es una lista vacía.

"root" y "folder": carpeta raíz y carpeta con los archivos que se va a listar, estas dos rutas deben ser la misma. La carpeta con los archivos a listar es la carpeta actual cuyos archivos se están listando, su valor lo controla el algoritmo y va recorriendo las subcarpetas que se van hallando.

"checked_folders": lista las subcarpetas en la carpeta del parámetro "root" que se desean omitir. Si se desea listar todos los archivos, se ingresa una lista vacía.

Python permite ingresar el separador de rutas como \ ó \\.

Esta función sólo ha sido probada en Windows, y ejecutada con Python Tool for Visual Studio usando Python 2.7