Создать метод для выполнения конкретной задачи. Если метод увеличивается в размере, это означает, что у него есть некоторые подзадачи, поэтому выделите (реорганизуйте) подзадачи в новый метод.
Любую рекурсивную функцию можно преобразовать в эквивалентную итеративную. Мне всегда легко сначала подумать рекурсивно:
static string GetColumnName(int index)
{
const int alphabetsCount = 26;
if (index > alphabetsCount) {
return GetColumnName(index / alphabetsCount) + GetColumnName(index % alphabetsCount);
} else {
int code = (index - 1) + (int)'A';
return char.ConvertFromUtf32(code);
}
}
Что можно просто преобразовать в:
static string GetColumnName(int index)
{
const int alphabetsCount = 26;
string result = string.Empty;
while (index > 0) {
result = char.ConvertFromUtf32(64 + (index % alphabetsCount)) + result;
index /= alphabetsCount;
}
return result;
}
Тем не менее, послушайте Джоэла.
См. Этот вопрос:
Преобразование индекса столбца в имя столбца Excel
или в этот:
Как преобразовать номер столбца (например, 127) в Excel столбец (например, AA)
Хотя первая ссылка имеет правильный ответ прямо вверху, а вторая - несколько неправильных.
Рекурсия - одна из возможностей - если index> 26
, вы имеете дело с index% 26
в этом вызове и объединяете его с рекурсивным вызовом на index / 26
. Однако итерация часто бывает более быстрой, и ее несложно организовать для таких простых случаев, как этот. В псевдокоде:
string result = <convert `index % 26`>
while index > 26:
index = index / 26
result = <convert `index % 26`> + result
return result
или подобном.
static string GetColumnName(int index) { const int alphabetsCount = 26; string result = ''; if (index >= alphabetsCount) { result += GetColumnName(index-alphabetsCount) } return (string) (64 + index); }
Мой C # УЖАСНЫЙ И РЖАВНЫЙ. Интерпретируйте это как псевдокод - он почти наверняка не будет компилироваться, но может помочь вам начать работу.
Я не хочу отвечать на вопрос на C #, но я собираюсь показать вам, насколько это просто в Haskell.
alphas :: [String]
alphas = [x ++ [c] | x <- ([]:alphas), c <- ['A'..'Z']]
Prelude> take 100 alphas
["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T",
"U","V","W","X","Y","Z","AA","AB","AC","AD","AE","AF","AG","AH","AI","AJ","AK",
"AL","AM","AN","AO","AP","AQ","AR","AS","AT","AU","AV","AW","AX","AY","AZ","BA",
"BB","BC","BD","BE","BF","BG","BH","BI","BJ","BK","BL","BM","BN","BO","BP","BQ",
"BR","BS","BT","BU","BV","BW","BX","BY","BZ","CA","CB","CC","CD","CE","CF","CG",
"CH","CI","CJ","CK","CL","CM","CN","CO","CP","CQ","CR","CS","CT","CU","CV"]