Я пытаюсь реализовать сортировку по основанию в Swift (строго от скуки). До сих пор я основывал свою работу на методе C/C++, найденном здесь.
По большей части все работает так, как я и ожидал, за исключением одного цикла for, который доставляет мне проблемы.
for (int exp = 1; max / exp > 0; exp *= 10)
Swift больше не поддерживает циклы в стиле C, так что это не сработает. Я пытался воссоздать цикл, используя несколько подходов, включая этот:
var exp: Int = 1
for _ in (1..<(max / exp)).reversed()
{
//My code
exp = exp * 10
}
Проблема здесь в том, что Int
не может содержать размер exp
после нескольких итераций цикла. Поскольку исходное определение цикла прекрасно работает в Objective-C, я считаю, что мой полный подход ошибочен, но я не вижу, где именно.
Какие-нибудь мысли?
Int.max
в конце вашего ответа. - person dfrib   schedule 30.10.2016INT_MAX
:exp *= 10
может переполниться, даже еслиmax/exp > 0
(что эквивалентноexp <= max
для положительных чисел). - person Martin R   schedule 30.10.2016exp = sequence(first: exp, next: { $0 <= max/10 && 0 < max/$0 ? $0 * 10 : nil}).reduce(0) { $1 }
должен безопасно решить ваше преобразование цикла C-> Swift. - person dfrib   schedule 30.10.2016reduce
выше (единственная альтернатива, которую я мог придумать, была.map { $0 }.last ?? 0
). - person dfrib   schedule 30.10.2016var exp = 1; while 10 * exp <= max { exp *= 10 }
. - person Martin R   schedule 30.10.2016while
, вероятно, должен использовать условиеexp <= max/10
(или переполнение для достаточно большихmax
значений, поскольку10 * exp
проверяется один раз даже для неудачного теста,> max
). - person dfrib   schedule 30.10.2016while
, как было предложено, и он отлично сработал. Думаю, после нескольких часов изучения алгоритмов сортировки я потерял из виду лес за деревьями. Спасибо, парни! - person William Smith   schedule 30.10.2016