С помощью рекурсии создайте программу, которая возвращает нечетные числа из массива в виде строки в определенном формате c#

#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 от других случаев. Итак, есть два метода: «общедоступный» метод для запуска печати и частный рекурсивный метод, который «печатает» числа.