По вашей реализации:
1) Конструкцию типа list.Count() == 0 можно заменить спокойно вызовом list.Any()
2) Почему возвращается 0, когда в коллекции нету элементов? Разве это не исключительная ситуация? Может стоит бросать ошибку?
3) Правильно ли я понимаю, что в этой строчке опечатка: int subMax = count(list.Skip(1));. Предполагаю, что вместо вызова метода count() должен вызываться метод Max()?
4) Ваш алгоритм неправильно отработает для случая, когда коллекция содержит только один элемент.
5) Постоянные вызовы list.ToArray() создают лишние объекты в памяти, используйте просто list.ElementAt(index) для получения нужного элемента в коллекции с указанным индексом.
По поводу реализации из книги: в целом, большой разницы между вашей реализации и реализацией из книги я не вижу, т.к. они используют один и тот же принцип рекурсивности. По факту, вы просто заменили тернарный оператор на if и зачем-то убрали остальные проверки. В этом плане алгоритм из книги лучше, т.к. он, во-первых он выбрасывает исключение для пустой коллекции, а во-вторых он правильно отрабатывает для коллекции, состоящей только из одного или двух элементов. Единственное только что меня смущает, так это постоянные вызовы First(), Skip(), Take(). Как по мне, было бы лучше загнать результаты вызовов этих методов единожды в одну переменную и работать уже непосредственно с этой переменной