- Notifications
You must be signed in to change notification settings - Fork 263
Description
This question needs redesigned as it enters the realm of "silly" when you can solve this in 1 line of code using first(predicate)
, none
, any
, find(predicate)
, etc. You'd have to list all functions they could not call to make them really want to recurse. If you want a recursive question, then force it with a custom data structure (NodeLinkedList) that doesn't have 10 existing methods that already do the same answer.
If you don't use a custom data structure, the silly factor is that people know they can just call:
return list.any { callback(it) }
Also, the existing Solution1
throws an exception on empty list. Probably not intended but also is not documented?
private object Solution1 { private fun anyCallback(list: List<Int>, callback: (Int) -> Boolean): Boolean { if (list.size == 1) { return callback(list.first()) } // THROWS EXCEPTION ON EMPTY LIST!!!! return callback(list.first()) || anyCallback(list.drop(1), callback) } }
the solution could be a little more efficient (don't copy the list, copy a view of the list instead):
internal object Solution2 { fun anyCallback(list: List<Int>, callback: (Int) -> Boolean): Boolean { if (list.isEmpty()) return false return callback(list.first()) || anyCallback(list.subList(1, list.size), callback) } }
Of course that assumes it isn't a LinkedList, but there is always:
internal object Solution3 { fun anyCallback(list: List<Int>, callback: (Int) -> Boolean): Boolean { fun _randomAccessOptimized(list: List<Int>, callback: (Int) -> Boolean): Boolean { if (list.isEmpty()) return false return callback(list.first()) || _randomAccessOptimized(list.subList(1, list.size), callback) } fun _sequentialOptimized(list: List<Int>, callback: (Int) -> Boolean): Boolean { if (list.isEmpty()) return false return callback(list.first()) || _sequentialOptimized(list.drop(1), callback) } return if (list is RandomAccess) { _randomAccessOptimized(list, callback) } else { _sequentialOptimized(list, callback) } } }