Давайте рассмотрим ваш алгоритм для ввода {1,2,3}:
tmp
после рекурсивного вызова:
private void getPerm(int n, int[] a, ArrayList<Integer> tmp, ArrayList<List<Integer>> result)
{
if(n == 0){
ArrayList<Integer> toAdd = new ArrayList<Integer>(tmp);
result.add(toAdd);
// don't clear tmp here
return;
}
for(int i = 0; i < n; i++){
tmp.add(a[i]);
int[] b = new int[n-1];
int k = 0;
int j = 0;
while(k<b.length){
if(a[i]==a[j]){j++;}
else{b[k]=a[j]; k++; j++;}
}
getPerm(n-1, b, tmp, result);
tmp.remove(tmp.size()-1); // remove the last element added to tmp
}
}
Теперь вывод:
[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]
На самом простом уровне у них есть различные переключатели компиляции - т.е. Debug.WriteLine
и т.д. только переключается, если Вы имеете DEBUG
символ компиляции (не характерный для сборок конечных версий), тогда как Trace.WriteLine
будет обычно включаться даже в сборках конечных версий.
Trace
маршрут имеет настраиваемые приемники трассировки, которые могут быть установлены вертикально на пути конфигурация; Debug
обычно переходит к отладчику как слушатель. Конечно, существуют сторонние системы трассировки, которые предлагают намного больше гибкости.
Можно включить и выключить обоих независимо с переключателем компилятора, если Вы переходите к странице сборки своих свойств проекта, у Вас есть некоторые флажки там.
Эмпирическое правило для меня - то, что я использую отладку для фактической отладочной информации, т.е. значение переменной x в этой точке... и т.д., и Трассировка для трассировки потока управления через мое приложение (больше спама как).
Я был склонен использовать Трассировку (со связанным TraceSwitch) для входа усилий в средах выпуска - быстрая тонкая настройка app.config может затем дать разные уровни входа без потребности в перекомпиляции (который мог бы заставить проблему уйти так или иначе), или потребность присоединить отладчик. Особенно удобный для проблем, которые только происходят на машинах клиента по любой причине - я использовал это для успешного дампа выходить из класса FTP (назад в старой Платформе 1,1 дня), чтобы помочь диагностировать сетевые проблемы передачи между двумя компаниями
Как Вы говорите, вызовы Трассировки только выполняются, когда Вы находитесь в режиме выпуска. Компиляция в режиме Release имеет некоторые выигрыши в производительности, которые можно хотеть в оконечном приложении, и могут быть другие причины, Вы хотите включить режим Release. Однако могут быть времена, когда Вы хотите записать информацию к консоли трассировки, которая может быть просмотрена с приложениями, такими как DbgView SysInternal. Это обычно сообщения, что Вы не обязательно хотите отправить к выводу журнала, или который Вы всегда хотите иметь в наличии для отладки целей, даже если пользователь выключил вход.
Вы, конечно, не хотели бы отправлять большую информацию к консоли Trace, поскольку она действительно налагает потерю производительности, но некоторая критическая информация могла бы быть соответствующей.