Используя рекурсию для подведения итогов чисел

Если я вас правильно понял, вы хотите украсить сам код. К счастью, вам не нужно делать это вручную - вообще.

Для него есть привязка клавиш, которая может варьироваться в зависимости от вашей ОС и того, какой макет вы используете по умолчанию. Перейдите в файл -> настройки -> раскладка клавиатуры и найдите auto-indent. Вот что я получаю в Windows 10 с таблицей ключей по умолчанию:

enter image description here

Опять же, что у вас может зависеть от ОС (я предполагаю, это в основном относится и к Mac), и к вашей таблице ключей, но вы можете автоматически делать отступы своего кода в соответствии со стандартами языка, используя Ctrl kbd> + Alt kbd> + I kbd >.

Обратите внимание, что это в основном делает отступ. Если вы выбрали код для игры в гольф и хотите раскрутить его, это не сработает. По крайней мере, это не для Java.

Однако: Это работает только с файлами кода, которые поддерживает IDE или плагины. Это не сработает, т. Е. Файл .txt из коробки.


Если я вас неправильно понял, а вы хотите удалить только вкладки без автоматического отступа, есть как минимум два других варианта.

Первый вариант - использование нескольких курсоров. Вы можете добавить дополнительный курсор с помощью shift kbd> + alt kbd> + щелчка мышью там, где вы хотите курсор, или удерживая колесо мыши и перемещая курсор, удерживая колесо мыши нажатым. Могут быть и другие методы, но я знаю о них два.

Если у вас есть несколько курсоров, удалите вкладки, как обычно. Но будьте осторожны! Это может привести к удалению всей строки. Если это так, вы можете сделать 1 вкладку / n единиц на уровень отступа слева и нажать вместо этого вместо удаления.

(AFAIK) нет ограничений на количество курсоров, которые вы можете иметь одновременно, но вы можете теоретически сделать это с 50 строками одновременно, если хотите. Но общий совет - не добавляйте больше курсоров, чем вы видите сразу. Они работают параллельно, и легко потерять след, если вы не будете осторожны, и вы можете в конечном итоге удалить то, что не хотели удалять.


И, наконец, решение для регулярных выражений:

Примечание: Будьте осторожны с этим. Если вы используете его неправильно, вы можете получить нежелательные результаты.

Если вы хотите сделать это только на ограниченной территории, сначала выделите ее. Затем нажмите CTRL + R, и вы увидите обычное меню замены. Убедитесь, что выбраны Regex и In Selection.

Базовое регулярное выражение, которое нужно использовать, - ^([\s]{2,4}|\t). Объяснение только для справки:

^ - At the start of the line
(
    \s{4}   - Match 4 spaces
    |\t     - Or a tab character
)

Заменить ничем и нажать «заменить все» (или просто использовать обычную кнопку «заменить», если вы хотите перепроверить, прежде чем что-либо делать). Это заменит одно вхождение из 4 пробелов или один символ табуляции. Если вы используете отступ, не основанный на 4, измените число.

Это полезно и полезно только в том случае, если вы обнаружили, что с одинаковыми отступами во всех соответствующих строках - это не исправит ошибки и / или несоответствия отступов, такие как отступ с 3 пробелами Вы хотите 4 или случайную неопределенность для того же блока. Вместо этого используйте первый или альтернативно второй метод.

13
задан GEOCHET 24 April 2009 в 13:50
поделиться

9 ответов

Вы возвращаете 1 в предложении else. Вы должны возвращать 0:

else
{
    return 0;
}

Если значение не больше нуля, зачем вам возвращать его в первую очередь?

35
ответ дан 1 December 2019 в 17:11
поделиться

Ваш код выполняется следующим образом:

Sum --> 5
  Sum --> 4
    Sum --> 3
      Sum --> 2
        Sum --> 1
          Sum --> 0
          1 <---
        2 <---
      4 <---
    7 <---
  11 <---
16 <---

Проверьте базовый вариант.

17
ответ дан 1 December 2019 в 17:11
поделиться

Другие уже отметили ошибку, и я подробно остановлюсь на рекурсии.

Хотя C # в настоящее время не выполняет оптимизацию хвостового вызова (хотя IL имеет специальную инструкцию tail ), Стоит отметить, что хвостовая рекурсия, как правило, хорошая вещь.

Хвостовая рекурсия является частным случаем рекурсии, в котором последняя операция функции, хвостовой вызов, является рекурсивным вызовом. Поскольку последний вызов является рекурсивным, нет необходимости сохранять кадр стека вызывающей функции, и компилятор может легко использовать эту информацию для генерации машинных инструкций, так что стек вообще не увеличивается. Таким образом, он может превратить рекурсивную функцию в итеративную.

Переписать код для поддержки хвостовой рекурсии можно следующим образом:

static int Sum(int result, int value)
{
    if(value == 0)
        return result;

    return Sum(result + 1, value - 1);
}
13
ответ дан 1 December 2019 в 17:11
поделиться
static int Sum(int value)
{
    if (value > 0)
    {
        return value + Sum(value - 1);
    }
    else
    {
        return 0; //Change this.
    }
}
7
ответ дан 1 December 2019 в 17:11
поделиться

Это потому, что когда значение равно 0, вы возвращаете 1. Затем оно добавляется.

Предложение «else» Суммы должно возвращать 0.

5
ответ дан 1 December 2019 в 17:11
поделиться

Я всегда предпочитаю ставить завершающие прецеденты, чтобы они были очевидны, и у меня сильная почти психопатическая ненависть "если cond, то вернуться a else return b " конструкции. Мой выбор был бы (давая понять, что он не будет работать должным образом для отрицательных чисел):

static unsigned int Sum(unsigned int value) {
    if (value == 0)
        return 0;
    return value + Sum(value - 1);
}

Я полагаю, что это гораздо более читабельно, чем болван фигурных скобок и поток управления.

4
ответ дан 1 December 2019 в 17:11
поделиться

Другие уже ответили на этот вопрос, но когда я работаю с рекурсией, мне нравится проверять, работает ли она, проверять базовый случай и один дополнительный случай. В вашем случае я бы протестировал его с 1, что привело бы к 2. Поскольку это, очевидно, неправильно, вы можете проверить на 0, который не будет использовать какую-либо рекурсию, и поэтому должно быть очевидно, что ошибка лежит в базовом классе.

В целом рекурсию легче рассуждать, так как вы можете перечислить ограниченное количество вещей, которые вам нужно проверить, но изначально это требует прыжка веры, поскольку ваша интуиция будет неправильной. Просто проверьте граничные случаи и доверяйте математике , она никогда не потерпит неудачу.

4
ответ дан 1 December 2019 в 17:11
поделиться

Я уверен, что проблема в том, что вы хотите, чтобы ваша рекурсия завершилась, когда значение == 1 , и в данный момент она заканчивается, когда значение = = 0 .

1
ответ дан 1 December 2019 в 17:11
поделиться

Ваше конечное выражение является предметом спора. Когда значение == 0 (или ниже), оно должно возвращать 0, а не 1. Ради эффективности (что, допустим, здесь, очевидно, не является проблемой, иначе рекурсия не использовалась бы для этой задачи) , вы должны завершить рекурсию со значением == 1 и вернуть литерал 1, чтобы сохранить один ненужный уровень рекурсии.

1
ответ дан 1 December 2019 в 17:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: