Tower of Hanoi Algorithm

As a teacher of Computer Science, you know that understanding algorithms is crucial. Delving into the complexity of the Tower of Hanoi Algorithm will shed light on many of its aspects. You'll learn the definition, the key components and the implementation of the Tower of Hanoi Algorithm. Moreover, you'll gain insight into the practicality of the Tower of Hanoi Recursive Algorithm, its representation, and real-life examples. Going a step further, you will discover how to code the Tower of Hanoi Algorithm in Python, starting from the basics. As you advance, you'll learn how to enhance your Python skills to perform this algorithm better. Additionally, you'll comprehend the time complexity involved and how to calculate it. By looking at the various solutions available to solve this problem, you can uncover the best fit. To wrap things up, you'll conduct an expert analysis of the Tower of Hanoi Algorithm to increase your critical thinking and comprehension in the field of algorithmic structures. This exploration will equip you with extensive knowledge of this fascinating algorithm.

Tower of Hanoi Algorithm Tower of Hanoi Algorithm

Create learning materials about Tower of Hanoi Algorithm with our free learning app!

  • Instand access to millions of learning materials
  • Flashcards, notes, mock-exams and more
  • Everything you need to ace your exams
Create a free account
Table of contents

    Understanding the Tower of Hanoi Algorithm

    The Tower of Hanoi Algorithm bears its name from a mathematical game originally invented by the French mathematician Édouard Lucas in 1883. This algorithm is a brilliant example of recursion in use, a prominent concept in computer science. It aids in comprehending how algorithms work, making complex concepts more manageable.

    Defining the Tower of Hanoi Algorithm

    The Tower of Hanoi Algorithm finds its application in the world of problem-solving, particularly in puzzles and games. It showcases the power of recursive programming. To understand the algorithm, imagine you have three rods and a number of disks of different sizes. The disks are placed in increasing size from top to bottom, forming a tower on the first rod.

    The objective of the algorithm is to move the entire stack to the last rod, obeying these simple rules:

    1. Only one disk can be moved at a time.
    2. Each move consists of taking the upper disk from one of the stacks and placing it on top of another stack or on an empty rod.
    3. No disk may be placed on top of a smaller disk.

    The number of moves required to solve a Tower of Hanoi puzzle is \(2^n - 1\), where \(n\) is the number of disks.

    If you have two disks, you need a minimum of 3 moves to solve the puzzle. The steps would be as follows:

    1. Move the smaller disk from Rod 1 to Rod 2
    2. Move the larger disk from Rod 1 to Rod 3
    3. Move the smaller disk from Rod 2 to Rod 3

    Key Components of the Tower of Hanoi Algorithm

    To successfully implement the Tower of Hanoi Algorithm, understanding its key components can be beneficial.

    It comprises three main recursive steps:

    1. Shift \(n-1\) disks from the source rod to an auxiliary rod.
    2. Move the remaining disk to the target rod.
    3. Shift the \(n-1\) disks from the auxiliary rod to the target rod.

    When you have three disks, you follow these steps:

    1. Move two disks (1 and 2) from Rod 1 (source) to Rod 2 (auxiliary) using Rod 3 (target).
    2. Move the remaining disk (3) to the target rod.
    3. Move the two disks from the auxiliary rod to the target rod.

    By breaking the problem into smaller, manageable problems (disks), you iteratively solve the puzzle. This makes it a beautiful illustration of recursion.

    The Tower of Hanoi algorithm holds a significant place in teaching the concepts of recursion and fundamental algorithmic principles. This algorithm beautifully illustrates a pyramid construction, which endlessly fascinates computer scientists and math lovers alike.

    Understanding the Tower of Hanoi algorithm can be an engaging way to comprehend the concept of recursion. Its tangible nature simplifies the navigating process through the fundamental algorithmic principles.

    The Tower of Hanoi Recursive Algorithm

    To fully grasp the Tower of Hanoi recursive algorithm, it's crucial to understand the recursive functions. Recursion, in general, is a technique where a function calls itself until a terminating condition is met. Let's break it down.

    Recursion involves:

    • A base case or stopping criterion - terminating condition which ends the recursive calls.
    • Recursive case - function call to itself.

    The recursive algorithm for the Tower of Hanoi follows the principle of reducing the problem's size at each recursive call. It moves the \(n-1\) disks to the auxiliary rod, moves the nth disk to the destination rod, and completes the problem by moving the \(n-1\) disks to the destination rod.

    The concept of recursion might appear confusing initially, but it makes complicated problems, such as the Tower of Hanoi, drastically simpler. The key is to visualise the problem and keep track of what changes with each recursive call.

    Examples of the Tower of Hanoi Recursive Algorithm

    Moving on to some concrete instances can help you comprehend the Tower of Hanoi recursive algorithm better. We'll discuss two scenarios - first when there are three disks, and later when there are four disks.

    Let's denote the rods as A (source), B (auxiliary), and C (target) for better clarity.

    Here's an HTML-table driven step-by-step breakdown for three disk scenario:

    StepMove
    1Move disk 1 from rod A to rod C
    2Move disk 2 from rod A to rod B
    3Move disk 1 from rod C to rod B
    4Move disk 3 from rod A to rod C
    5Move disk 1 from rod B to rod A
    6Move disk 2 from rod B to rod C
    7Move disk 1 from rod A to rod C

    For each step, we're actions follow the rules of the game - we move a single disk at a time without placing larger disk on top of a smaller disk.

    Next, we'll examine what happens with four disks:

    
    Procedure Hanoi(disk, source, target, auxiliary):
    IF disk == 1, THEN
       move disk from source to target
    ELSE
       Hanoi(disk - 1, source, auxiliary, target)   // Step 1
       move disk from source to target              // Step 2
       Hanoi(disk - 1, auxiliary, target, source)   // Step 3
    END IF
    

    This code ensures that each move complies with the Tower of Hanoi puzzle rules. The process repeats until every disk has been transferred to the target rod.

    This recursive solution to the Tower of Hanoi puzzle efficiently maps out the least number of steps to solve the puzzle with any number of disks. It demonstrates the power and elegance of recursive algorithms in tackling seemingly complex problems.

    Implementing the Tower of Hanoi Algorithm in Python

    After understanding the Tower of Hanoi Algorithm and its recursive nature, you are now ready to bring it to life using Python, one of the most user-friendly and versatile programming languages. Python is an excellent choice, providing simple syntax, powerful libraries and being a popular language in the field of Computer Science globally. Let's start from the basics.

    Begin with Basic Python for the Tower of Hanoi Algorithm

    If you are just setting foot into Python or need a quick refresher before we dive into the Tower of Hanoi's code, there are a few fundamental concepts to remember.

    To effectively implement the Tower of Hanoi Algorithm, you should be comfortable using:

    • Data Types (Integers, Strings).
    • Functions.
    • Conditionals (if, else, elif).

    With your foundation set, let's look at a basic implementation of the Tower of Hanoi Algorithm using Python:

    The Python code will be:

    
    def hanoi(n, source, target, auxiliary):
       if n > 0:
          # move n - 1 disks from source to auxiliary, so they are out of the way
          hanoi(n - 1, source, auxiliary, target)
          
          # move the nth disk from source to target
          print('Move disk %i from %s to %s' % (n, source, target))
          
          # move the n - 1 disks that we left on auxiliary to target
          hanoi(n - 1, auxiliary, target, source)
          
    # initiate call from source A to target C with auxiliary B
    hanoi(3, 'A', 'C', 'B')
    

    When creating recursive functions, always remember to include a base case. This is vital to ensure that the recursion does not go on indefinitely. In this algorithm, the base case is when there are no more disks to move, i.e., when \(n\) is zero.

    Enhancing Your Skills: Tower of Hanoi Algorithm Python

    Learning is a continuum. After implementing the basic version of the Tower of Hanoi Algorithm, enhancing your Python skills and reinforcing your understanding of the algorithm can often prove fruitful. An excellent way to do this is by expanding your coding capabilities.

    Using graphical elements to visualise the movement of disks, creating an interactive version where users input the number of disks, or perhaps providing step-by-step explanations of each move in the algorithm are all worthwhile enhancements.

    Some potential Python tools and libraries you might use include:

    • tkinter for Graphical User Interface (GUI) development.
    • NumPy for efficient array handling.
    • matplotlib for data visualisation.

    Interested in making your Tower of Hanoi Algorithm interactive? Here's how you could modify your Python code to allow user input:

    
    def hanoi(n, source, target, auxiliary):
       if n > 0:
           hanoi(n - 1, source, auxiliary, target)
           print('Move disk %i from %s to %s' % (n, source, target))
           hanoi(n - 1, auxiliary, target, source)
    
    # prompt user for the number of disks
    n = int(input('Enter the number of disks: '))
    
    # initiate call from source A to target C with auxiliary B
    hanoi(n, 'A', 'C', 'B')
    

    These enhancements not only allow you to delve deeper into Python but also improve your comprehension of the Tower of Hanoi Algorithm, and its implementation. Always remember, the skill lies in understanding the problem in its entirety and attempting to solve it in smaller manageable parts.

    As you explore this powerful algorithm and Python, you'll find that they elevate your problem-solving skills to new heights in the world of Computer Science.

    Getting Grips with Tower of Hanoi Algorithm Time Complexity

    In computer science, the time efficiency of an algorithm plays a significant role in determining its suitability for a problem. Time complexity refers to the computational complexity that describes the amount of computational time taken by an algorithm to run, as a function of the size of the input to the program. Now, let's understand how it pertains to the Tower of Hanoi Algorithm.

    Understanding Time Complexity in the Tower of Hanoi Algorithm

    In the context of the Tower of Hanoi Algorithm, time complexity forms a crucial part of understanding the algorithm's efficiency. If you're unfamiliar with the concept, time complexity analyses how the runtime of an algorithm grows as the input size increases. Time complexity is usually expressed using Big O notation, which describes the upper bound of the time complexity in the worst-case scenario.

    The Tower of Hanoi puzzle is a classic example of a recursive algorithm. In each move, the algorithm calls itself twice. Once it moves the smaller \(n-1\) disks out of the way onto the auxiliary rod, to free the largest disk. After moving the largest disk to the target rod, the algorithm calls itself again to move the \(n-1\) disks onto the target rod, on top of the largest disk.

    Therefore, it's a nested recursive call where the algorithm recursively solves two sub-problems, each one is slightly simpler than the original problem.

    The key characteristics of the Tower of Hanoi Algorithm that affect its time complexity include:

    • Recursive nature: The algorithm solves two sub-problems for each problem.
    • Problem size: The size of the problem reduces by one disk with every recursive call.
    • Data Movement: Only one disk move is performed between recursive calls.

    When analysing time complexity, understanding the relation between problem size and number of operations is crucial. For the Tower of Hanoi Algorithm, this translates into understanding how the number of required moves correlates with the number of disks, as the problem size.

    Calculating the Time Complexity of the Tower of Hanoi Algorithm

    With the understanding of time complexity, let's ascertain the same for the Tower of Hanoi Algorithm. Keep in mind that, for each move, the algorithm calls itself twice, and the size of the problem reduces by one disk with every recursive call.

    A simple way to view the Tower of Hanoi Algorithm’s time complexity of is to consider the number of moves to solve the problem. This measure can be viewed as a direct analogue of the time complexity.

    Indeed, the puzzle with \(n\) disks requires \(2^n - 1\) moves to solve, verifying the recursive formula. Being a function of the exponential of the input size, the time complexity of this algorithm is often said to be of the order \(O(2^n)\)

    The sequence of moves required to solve the Tower of Hanoi puzzle, follows the recursive formula:

    \[ T(n) = 2T(n-1) + 1 \]

    with the base case \(T(0) = 0\). Solving this recurrence relation results in:

    \[ T(n) = 2^n - 1 \]

    For example, for a puzzle with three disks, you can verify this by noting that:

    \[ T(3) = 2T(2) + 1 = 2(2^2 - 1) + 1 = 2^3 - 1 = 7 \]

    Indeed, it takes seven disk moves to solve a three-disk Tower of Hanoi puzzle.

    An algorithm with \(O(2^n)\) time complexity may initially seem like an efficient solution for small problem sizes, but it rapidly becomes impractical as the problem size, the number of disks in this case, increases. This showcases the importance of time complexity and efficiency in algorithm design and selection.

    The Tower of Hanoi Algorithm offers an intriguing perspective on time complexity analysis in recursive algorithms. While the algorithm solves a seemingly complex problem elegantly, it also highlights the challenges associated with recursive algorithms and their efficiency. Understanding such aspects is crucial to developing more efficient algorithms and refining your problem-solving skills in computer science.

    Finding the Perfect Tower of Hanoi Solution Algorithm

    When talking about solutions to the Tower of Hanoi puzzle, the one that comes to mind involves a simple, elegant recursive algorithm. However, it's also essential to understand that while recursion is a powerful tool, it does come with its own set of limitations - in particular, its exponential time complexity that can make it impractical for larger problem sizes.

    Detailed Exploration of Tower of Hanoi Solution Algorithm

    The Tower of Hanoi recursive algorithm is a method to solve the puzzle by breaking it down into a series of smaller, similarly structured sub-puzzles. This algorithm utilises the power of recursion and the principle of divide and conquer, where a problem is divided into smaller subproblems of the same type and the solutions of these subproblems are combined to form the solution of the original problem.

    The Tower of Hanoi recursive algorithm involves the following major steps:

    1. Recursively move \(n-1\) disks from the source rod to the auxiliary rod.
    2. Move the nth disk from the source rod to the target rod.
    3. Finally, again recursively, move the \(n-1\) disks from the auxiliary rod to the target rod.

    By performing these steps iteratively, by decreasing the problem size with each recursive call, the algorithm eventually solves the entire puzzle. For a puzzle with \(n\) disks, this results in a minimum of \(2^n - 1\) disk moves.

    However, it's worth noting that this algorithm, while elegant, has an exponential time complexity of \(O(2^n)\) as it involves \(2^n - 1\) steps (or moves) to solve the problem for \(n\) disks.

    This factor limits its application for larger numbers of disks. In computer science terms, any algorithm with an exponential time complexity is considered inefficient as the number of computational steps increases steeply with the size of the input.

    The algorithm represents the elements in computer science that fascinate many — the ability to break down complex problems into simpler, manageable ones and the elegance of logical solutions that effectively solve problems. However, it also draws attention to the importance of keeping time complexity and practically in mind when designing algorithms.

    Comparing Different Solutions for the Tower of Hanoi Algorithm

    While the recursive solution is the most commonly used algorithm for solving the Tower of Hanoi puzzle, it is not the only approach. Several other algorithms have been proposed to optimise different aspects of the puzzle.

    Other proposed solutions include iterative algorithms, algorithms optimised for even numbers of disks, and algorithms that optimise the order of moves:

    • Iterative Solution: An alternative to the recursive algorithm is an iterative algorithm using a stack data structure. This approach avoids the additional overhead of recursive calls, although it essentially simulates the same process and doesn't improve time complexity.
    • Even Disk Optimisation: For puzzles with an even number of disks, algorithms can take advantage of patterns in the puzzle's solution. For example, an effective solution strategy "moves the smallest disk in the same direction" results in an optimal solution.
    • Move-Optimisation Algorithms: A few algorithms focus on optimising the order of disk moves to find an efficient path to the solution. This isn't about reducing the number of moves, as the \(2^n - 1\) moves are mathematically proven to be the minimum, but rather about how these moves are ordered.

    Consider an iterative solution for the Tower of Hanoi problem with 3 disks:

    
    def hanoiIterative(n, source, target, auxiliary):
        stack = []
        stack.append((n, source, target, auxiliary))
        
        while stack:
            n, source, target, auxiliary = stack.pop()
            if n == 1:
                print('Move disk 1 from rod %s to rod %s' % (source, target))
            else:
                stack.append((n-1, auxiliary, target, source))
                stack.append((1, source, target, auxiliary))
                stack.append((n-1, source, auxiliary, target))
    

    This code uses a stack to store and retrieve the state of the problem at each step, instead of using recursive calls.

    Each of the mentioned algorithms offers a unique perspective on problem-solving and optimisation. However, none of the solutions improve upon the \(O(2^n)\) time complexity of the classic recursive algorithm. This reflects a profound truth in computer science - there are problems for which no fast solution exists, and the Tower of Hanoi puzzle happens to be one of them.

    Expert Analysis of the Tower of Hanoi Algorithm

    Analysing the Tower of Hanoi algorithm from the expert's lens can provide a whole new level of understanding. It's not just about appreciating the beauty of a recursive solution for an intriguing problem. Taking a deep dive into its workings, its strengths and potential areas for improvement can offer unique insights into the world of algorithms and problem-solving.

    Critical Analysis of the Tower of Hanoi Algorithm

    There's no doubt that the Tower of Hanoi Algorithm is a brilliant example of how recursion can be leveraged to solve a seemingly complex problem elegantly. However, a thoughtful analysis would also consider its limitations and explore possibilities for further optimisation. Let’s examine its different aspects one by one.

    On the positivity, the Tower of Hanoi Algorithm illustrates the iterative application of a simple set of rules to achieve a goal. In other words, it boils down a complex problem into a bite-sized, simpler progression of steps, demonstrating the concept of recursion beautifully.

    Moreover, this algorithm succeeds in reducing human errors. It provides a foolproof method - if the rules are applied correctly, there's no chance of ending up with an unsolvable situation. This deterministic nature, where a specific input always leads to the exact expected output, makes it a reliable algorithm.

    On the flip side, various elements deserve a critical look. They include:

    • Time Complexity: The most significant drawback is the exponential time complexity, \(O(2^n)\). As \(n\) (the number of disks) increases, the algorithm's efficiency decreases drastically, making it infeasible for large-scale problems.
    • Over-Reliance on Recursion: Every recursive call uses stack space, leading to a high memory consumption, which again limits its scalability.
    • Lack of Real-World Adaptability: While the algorithm excellently solves Tower of Hanoi puzzle, due to its specific rules, it lacks adaptability for real-world problem-solving.

    One possible area for exploration to optimise this algorithm is to investigate non-recursive versions. Iterative solutions, for instance, could potentially decrease the memory load and make the algorithm more practical for a larger number of disks. However, these often require more complex code and may not provide substantial improvements in terms of time complexity.

    The Tower of Hanoi Algorithm: A Comprehensive Assessment

    For a thorough assessment of the Tower of Hanoi Algorithm, it’s vital to reflect on its history, purpose, workings, and strengths. Equally important is to consider its limitations, possible room for enhancements, and how it compares with other problem-solving algorithms.

    The Tower of Hanoi Algorithm's birth itself is fascinating. The puzzle was invented by Édouard Lucas in 1883 and since then, it has become a classic problem studied in computer science courses worldwide. It beautifully introduces students to recursion concepts and problem-solving strategies.

    In terms of performance and utility, the algorithm doesn’t disappoint. It guarantees the minimal solution, i.e., the least number of moves to solve the puzzle, if followed correctly. As it only involves implementing a straightforward set of rules iteratively, the algorithm does an excellent job at handling the Tower of Hanoi puzzle.

    Its elegant implementation and the ability to convert a complicated problem into simpler sub-tasks are among the algorithm’s key strengths. It offers a step-by-step path to the solution, combining simplicity and efficiency in one package.

    However, when dissecting its shortcomings, we must consider the following aspects:

    • Scalability: The algorithm quickly becomes less practical as the number of disks increase because of its exponential time complexity. Running the algorithm with a large number of disks may require a prohibitive amount of time.
    • Complexity: While this algorithm is elegant and simple for the intended problem, adapting it for other real-world scenarios may involve increasing complexity.

    Regarding enhancements, non-recursive or iterative solutions could be potential alternatives. There's also space for optimisation specific to certain types of puzzles, such as those with an even number of disks. However, given its specific application, any dramatic enhancements may not fundamentally alter its performance.

    In comparison to other algorithms, the Tower of Hanoi Algorithm stands out for its simplicity and deterministic nature. However, its exponential time complexity and memory requirements because of recursion make it less efficient for large problem sizes compared to other algorithms with linear or polynomial time complexity.

    In essence, the Tower of Hanoi Algorithm is a charming mix of simplicity and elegance. While not perfect, its unique teaching value in recursion and problem-solving strategies compensate its limitations. As you continue exploring the world of algorithms, understanding such aspects can offer profound insights into the strengths, weaknesses, and application scenarios of various algorithms.

    Tower of Hanoi Algorithm - Key takeaways

    • The Tower of Hanoi Algorithm concerns a mathematical game invented by Édouard Lucas in 1883 which employs recursion to solve complex concepts.

    • The Algorithm involves moving a stack of disks between three rods, following rules of only moving one disk at a time, and never placing a larger disk on top of a smaller disk.

    • The number of moves required to solve the Tower of Hanoi puzzle is \(2^n - 1\), where \(n\) is the number of disks.

    • Key components of the tower of hanoi algorithm involve moving disks from the source rod to an auxiliary rod, moving the remaining disk to the target rod, and finally shifting the disk from the auxiliary rod to the target rod. This breaks down the problem into smaller, manageable problems using the principle of recursion.

    • This Tower of Hanoi Recursive Algorithm functions by applying the principle of reducing the problem's size at each recursive call, applying the game's rules and repeating the process until every disk has been transferred to the required rod.

    Tower of Hanoi Algorithm Tower of Hanoi Algorithm
    Learn with 18 Tower of Hanoi Algorithm flashcards in the free StudySmarter app

    We have 14,000 flashcards about Dynamic Landscapes.

    Sign up with Email

    Already have an account? Log in

    Frequently Asked Questions about Tower of Hanoi Algorithm

    How to solve tower of hanoi algorithm?

    To solve the Tower of Hanoi algorithm, you must follow these steps: First, move the smallest disk to the post that it is not on. Next, move the other disks to the other post that they are not on. Lastly, move the smallest disk to the final post. Repeat this process until all the disks are in the correct order on the final post.

    What algorithm does the tower of hanoi use?

    The Tower of Hanoi uses a recursive algorithm. This algorithm moves a stack of discs from one peg to another, adhering to the rules that only one disc can be moved at a time and no disc can be placed on top of a smaller one. The recursion process solves the problem by breaking it down into a simpler version of the same problem, plus some simple operations.

    How do you write the tower of hanoi algorithm?

    You typically write the Tower of Hanoi algorithm using recursion. First, create a function with parameters to represent source, destination and auxiliary towers along with the number of disks. At the start of the function, check if the number of disks is 1 and if so, directly move it from source to destination. If there are more disks, recursively call the function to move n-1 disks from source to auxiliary tower, then move the nth disk from source to destination and again, recursively move n-1 disks from the auxiliary tower to the destination tower, treating the source tower as auxiliary this time.

    What is the tower of hanoi problem logic?

    The Tower of Hanoi problem logic involves moving a stack of disks from one peg to another, using a spare peg, whilst following specific rules. The rules are: only one disk can be moved at a time, a move consists of taking the top disk from one of the stacks and placing it onto another stack, and a larger disk cannot be placed on top of a smaller one. The aim is to achieve this with the minimal number of moves. The solution is derived from mathematical induction and is typically solved using a recursive algorithm.

    What is the algorithm of the tower of hanoi for 5 disks?

    To solve the Tower of Hanoi problem for 5 disks using an algorithm, firstly, move the top 4 disks from source to auxiliary peg. Secondly, move the fifth disk from source to destination peg. Thirdly, move the 4 disks from the auxiliary peg to destination peg. This procedure follows the general rule of Tower of Hanoi: to solve for 'n' disks, move 'n-1' disks to the auxiliary peg, move nth (largest) disk to the destination peg, and finally move the 'n-1' disks from the auxiliary peg to destination peg.

    Test your knowledge with multiple choice flashcards

    What is the Tower of Hanoi Algorithm?

    What are the three main rules of the Tower of Hanoi Algorithm?

    What are the three recursive steps the Tower of Hanoi Algorithm comprises?

    Next
    1
    About StudySmarter

    StudySmarter is a globally recognized educational technology company, offering a holistic learning platform designed for students of all ages and educational levels. Our platform provides learning support for a wide range of subjects, including STEM, Social Sciences, and Languages and also helps students to successfully master various tests and exams worldwide, such as GCSE, A Level, SAT, ACT, Abitur, and more. We offer an extensive library of learning materials, including interactive flashcards, comprehensive textbook solutions, and detailed explanations. The cutting-edge technology and tools we provide help students create their own learning materials. StudySmarter’s content is not only expert-verified but also regularly updated to ensure accuracy and relevance.

    Learn more
    StudySmarter Editorial Team

    Team Tower of Hanoi Algorithm Teachers

    • 21 minutes reading time
    • Checked by StudySmarter Editorial Team
    Save Explanation

    Study anywhere. Anytime.Across all devices.

    Sign-up for free

    Sign up to highlight and take notes. It’s 100% free.

    Join over 22 million students in learning with our StudySmarter App

    The first learning app that truly has everything you need to ace your exams in one place

    • Flashcards & Quizzes
    • AI Study Assistant
    • Study Planner
    • Mock-Exams
    • Smart Note-Taking
    Join over 22 million students in learning with our StudySmarter App