Algorithmic Thinking: A Problem-Based Introduction
Daniel Zingaro
Learn to Code by Solving Problems: A Python Programming Primer