Write a function that appends two Rlists together and returns a new Rlist. The resulting Rlist should be a copy meaning that the input Rlists should not be modified AND modifying the resulting Rlist should not modify the two input Rlists.

``````def append_rlist_iter(a, b):
"""
>>> r = Rlist(1, Rlist(2))
>>> s = Rlist(3, Rlist(4))
>>> result = append_rlist_iter(r, s)
>>> result
Rlist(1, Rlist(2, Rlist(3, Rlist(4))))
>>> result.first = 5
>>> result
Rlist(5, Rlist(2, Rlist(3, Rlist(4))))
>>> r
Rlist(1, Rlist(2))
>>> s
Rlist(3, Rlist(4))
"""
``````

Here’s what my second discussion came up with. There’s a small bug causing the test to not pass, but a few of you wanted me to post what we came up with so that you guys can debug it on your own. Here it is:

``````def append_rlist_iter(a, b):
"""
>>> r = Rlist(1, Rlist(2))
>>> s = Rlist(3, Rlist(4))
>>> result = append_rlist_iter(r, s)
>>> result
Rlist(1, Rlist(2, Rlist(3, Rlist(4))))
>>> result.first = 5
>>> result
Rlist(5, Rlist(2, Rlist(3, Rlist(4))))
>>> r
Rlist(1, Rlist(2))
>>> s
Rlist(3, Rlist(4))

*** Here's what my second discussion came up with. There's a bug! Try and find it ***
"""
result = Rlist.empty
final_result = result
if a is not Rlist.empty:
result = Rlist(a.first)
a = a.rest
while a is not Rlist.empty:
result.rest = Rlist(a.first)
a = a.rest
result = result.rest

if b is not Rlist.empty:
if result is Rlist.empty:
result = Rlist(b.first)
b = b.rest
while b is not Rlist.empty:
result.rest = Rlist(b.first)
b = b.rest
result = result.rest
return final_result
``````

My solution will be posted later (along with the recursive and tail-recursive solutions).

I don't claim to be perfect so if you find an error on this page, please send me an email preferably with a link to this page so that I know what I need to fix!