res2001, в первом случае количество операций линейно растёт от входного значения. Сложность линейная - O(n)
А во втором случае наверное стоит учесть внутреннюю реализацию функции range? Если там цикл, например, то O(n^2). Или не так?
Если в range используется yeld для возврата промежуточных значений, то в каждом вызове происходит только проверка условия окончания и возврат следующего значения. В этом случае сложность всего алгоритма остается O(n).
Если в range есть цикл, тогда он возвращает массив последовательных элементов [1; n+1] и дальше цикл итерируется по значениям из массива. В этом случае range вызывается один раз. Тогда сложность будет O(n+n) = O(2n) = O(n)