Welcome to the Treehouse Community

The Treehouse Community is a meeting place for developers, designers, and programmers of all backgrounds and skill levels to get support. Collaborate here on code errors or bugs that you need feedback on, or asking for an extra set of eyes on your latest project. Join thousands of Treehouse students and alumni in the community today. (Note: Only Treehouse students can comment or ask questions, but non-students are welcome to browse our conversations.)

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and a supportive community. Start your free trial today.

Python Functional Python The Lambda Lambada Recursion

David Hernandez
seal-mask
.a{fill-rule:evenodd;}techdegree seal-36
David Hernandez
Python Development Techdegree Graduate 10,422 Points

Need some help with this recursion problem, I am truly lost here. I know I want to find a base step...

I'm going to try a bit more, but more guidance would be appreciated. I'm thinking somehow dig deeper to get to prereqs and titles until there are no prereqs.

courses.py
courses = {'count': 2,
           'title': 'Django Basics',
           'prereqs': [{'count': 3,
                     'title': 'Object-Oriented Python',
                     'prereqs': [{'count': 1,
                               'title': 'Python Collections',
                               'prereqs': [{'count':0,
                                         'title': 'Python Basics',
                                         'prereqs': []}]},
                              {'count': 0,
                               'title': 'Python Basics',
                               'prereqs': []},
                              {'count': 0,
                               'title': 'Setting Up a Local Python Environment',
                               'prereqs': []}]},
                     {'count': 0,
                      'title': 'Flask Basics',
                      'prereqs': []}]}


def prereqs(data, pres=None):
    pres = pres or set()

2 Answers

Jeff Muday
MOD
Jeff Muday
Treehouse Moderator 27,653 Points

This one is pretty tough, but it can be broken down... kind of a divide-and-conquer.

We are interested in the prerequisites-- it is a list. We'll loop over the list and for each item in the list data.get('prereqs') we call the prerequisite function prereqs() recursively.

This can be done MORE efficiently, but I think it's more clear this way.

def prereqs(data, pres=None):
    pres = pres or set()
    # step 0. get the courses as a list
    courses = data.get('prereqs')
    for course in courses:
        # step 1. add the title only to the set
        # step 2. call the function recursively
    # outside the loop
    # step 3. return the set pres

SPOILER ALERT

def prereqs(data, pres=None):
    """ find prerequisites RECURSIVELY and return the set()"""
    pres = pres or set() # basically if pres is None, it instead makes it an empty set

    # want to loop over the (prerequisite) courses
    courses = data.get('prereqs')
    for course in courses:

        # now, we want to add the title to our set
        # the cool thing is a set won't repeat a course!
        title = course.get('title')
        pres.add( title )

        # now, the recursive call to see if there are prerequisites to
        # the particular course we just added
        prereqs(course, pres)

    # return the finished set
    return pres
David Hernandez
seal-mask
.a{fill-rule:evenodd;}techdegree seal-36
David Hernandez
Python Development Techdegree Graduate 10,422 Points

This is what I was able to come up with.

def prereqs(data, pres=None):
    pres = pres or set()

    # current instance could be a list or dictionary
    if isinstance(data, list):
        if not data:
            return pres

        # prereqs exist, grab title and dig deeper
        pres.add(data[0]['title'])
        prereqs(data[0]['prereqs'], pres)

        # iterate through the list of prereqs
        return prereqs(data[1:], pres)

    return prereqs(data['prereqs'], pres)
Jeff Muday
MOD
Jeff Muday
Treehouse Moderator 27,653 Points

Awesome! I like that you handle the recursion in a fresh way. You nailed that Challenge!