#c# #arrays #recursion
#c# #массивы #рекурсия
Вопрос:
Строка должна выглядеть следующим образом «[1,3,5,7]» Я пробовал разные версии этого кода, но у меня всегда либо слишком много запятых, либо их недостаточно. Например, для этого массива «[2,4,7,8,10]» я получаю «[7,]».
static string ZwrocNieparzyste1(int[] tab, int i = 0)
{
if (tab.Length == 1)
if (tab[i] % 2 == 1)
return string.Format("[{0}]", tab[i]);
else
return "[]";
if (tab.Length == 0)
return "[]";
if (i == 0)
if (tab[i] % 2 == 1)
return string.Format("[{0},{1}", tab[i], ZwrocNieparzyste1(tab, i 1));
else
return string.Format("[{0}", ZwrocNieparzyste1(tab, i 1));
if (i < tab.Length - 1)
if (tab[i] % 2 == 1)
return string.Format("{0},{1}", tab[i], ZwrocNieparzyste1(tab, i 1));
else
return string.Format("{0}", ZwrocNieparzyste1(tab, i 1));
else
if (tab[i] % 2 == 1)
return string.Format("{0}]", tab[i]);
else
return "]";
}
Комментарии:
1. Почему именно вы хотите рекурсию? Поскольку это однострочник в LINQ…
2. Подумайте о том, что произойдет, если один вызов получит этот сценарий
return string.Format("{0},{1}", tab[i], ZwrocNieparzyste1(tab, i 1));
, а следующий получитreturn "]";
3. Не совсем ясно, что именно вы хотите сделать и как вы хотели бы использовать рекурсию
4. @mjwills Я готовлюсь к экзамену, и нас просят использовать определенные методы для решения задач
Ответ №1:
Ваш код слишком запутан… Слишком сложно для понимания. Пример того, как это можно упростить:
public static string PrintRecursive(int[] nums)
{
if (nums.Length == 0)
{
return "[]";
}
return PrintRecursiveImpl(nums, 0, false);
}
/// <summary>
///
/// </summary>
/// <param name="nums">The array of numbers</param>
/// <param name="ix">The ix that perhaps will be printed</param>
/// <param name="alreadyPrintedNumber">Do we need to prepend a comma?</param>
/// <returns></returns>
private static string PrintRecursiveImpl(int[] nums, int ix, bool alreadyPrintedNumber)
{
string ret = string.Empty;
if (ix == 0)
{
ret = "[";
}
if (nums[ix] % 2 == 1)
{
if (alreadyPrintedNumber)
{
ret = ", ";
}
ret = nums[ix];
alreadyPrintedNumber = true;
}
if (ix 1 < nums.Length)
{
ret = PrintRecursiveImpl(nums, ix 1, alreadyPrintedNumber);
}
else
{
ret = "]";
}
return ret;
}
Обратите внимание, что я отделил «особый случай» nums.Length == 0
от других случаев. Итак, есть два метода: «общедоступный» метод для запуска печати и частный рекурсивный метод, который «печатает» числа.