## Instructions

Download hw11.zip. Inside the archive, you will find starter files for the questions in this homework, along with a copy of the OK autograder.

Submission: When you are done, submit with `python3 ok --submit`. You may submit more than once before the deadline; only the final submission will be scored. Check that you have successfully submitted your code on okpy.org.

Readings: This homework relies on following references:

## Iterator/Generator Questions

### Question 1: Restart

Implement an iterator class called `IteratorRestart` that will reset to the beginning when `__iter__` is called again.

``````class IteratorRestart:
"""
>>> iterator = IteratorRestart(2, 7)
>>> for num in iterator:
...     print(num)
2
3
4
5
6
7
>>> for num in iterator:
...     print(num)
2
3
4
5
6
7
"""
def __init__(self, start, end):

def __next__(self):

def __iter__(self):

Use OK to test your code:

``python3 ok -q IteratorRestart``

### Question 2: Hailstone

Write a generator that outputs the hailstone sequence from Lab 01.

Here's a quick remainder of how the hailstone sequence is defined:

1. Pick a positive integer `n` as the start.
2. If `n` is even, divide it by 2.
3. If `n` is odd, multiply it by 3 and add 1.
4. Continue this process until `n` is 1.
``````def hailstone(n):
"""
>>> for num in hailstone(10):
...     print(num)
...
10
5
16
8
4
2
1
"""

Use OK to test your code:

``python3 ok -q hailstone``

### Question 3: Generate permutations

Given a list of unique elements, a permutation of the list is a reordering of the elements. For example, `[2, 1, 3]`, `[1, 3, 2]`, and `[3, 2, 1]` are all permutations of the list `[1, 2, 3]`.

Implement `generate_perms`, a generator function which takes in a `lst` and yields all the unique permutations of `lst` one at a time (see doctest for examples).

``````def generate_perms(lst):
"""
Generates the permutations of lst one by one.
>>> perms = generate_perms([1, 2, 3])
>>> hasattr(perms, '__next__')
True
>>> p = list(perms)
>>> p.sort()
>>> p
[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]
"""
``python3 ok -q generate_perms``
``python3 ok --submit``