Question: I am trying to write a function that returns `True` if the elements in `lst1` appear in `lst2` in the same order as they appear in `lst1`, but not necessarily consecutively.

For example,

`test([29, 5, 100], [20, 29, 30, 50, 5, 100])` should return `True`.

`test([25, 65, 40], [40, 25, 30, 65, 1, 100])` should return `False`.

Here is what I have so far:

```
def test(lst1, lst2):
    for i in range(len(lst1)-len(lst2)+1):
        if lst2 == lst1[i:i+len(lst2)]:
            return True 
    return False 

```

Answer: 
**Recursively, no clobbered lists, no new sublists, failing early**

```
def find_all(needle, haystack, npos=0, hpos=0):
  if npos >= len(needle):
    return True
  try:
    return find_all(needle, haystack, npos+1, haystack.index(needle[npos], hpos)+1) 
  except ValueError:
    return False

print find_all([1,3,5], [1,2,3,4,5,6,7]) # True
print find_all([1,5,3], [1,2,3,4,5,6,7]) # False

```
This scans the lists and is a different approach:

```
def test(lst1, lst2):
    p2 = 0
    length = len(lst2)
    for e1 in lst1:
        for p in range(p2, length):
            if e1 == lst2[p]:
                p2 = p
                break
        else:
            return False    
    return True

```

For each element in `lst1` it searches the subset of list 2 (between `p2` and the end) for it. If it is found, it restricts the range following searches by updating `p2`. If it is not found, `False` is returned. `True` is returned if every element in `lst1` is found.