I don't fully understand the recursive version but I think the problem is this line:
count = naive_dac(list(arr[0:len(arr) - 1]))
Every time you call the recursive function you are creating a copy of your list and this operation is time consuming. Depending on the size of the list this can affect drastically the algorithm's performance. Is really necessary to create a copy?
Assuming that your algorithm is correct and as you don't modify the list you can use a variable to store the length of the list.
def naive_dac(arr, length):
if length == 1:
return 0
count = naive_dac(arr, length - 1)
for i in range(0, length):
if arr[i] > arr[length-1]:
count += 1
return count
EDIT: The extra overhead was caused by the castings: int(arr[i]) ...
.