в рекурсии, когда вам нужно «держать» след что-то на одну итерацию, есть несколько способов:
Примитивные глобальные переменные - Они позволяют только единичные состояния будут сохранены. Если ветви рекурсии и т. Д., Она может не работать, потому что одна ветвь перезапишет значение, используемое другой ветвью. Для простого хранения таких вещей, как counts, и такие, как правило, работают хорошо.
Передача параметров функции - Параметры функции хранятся в стеке. Когда функция вызывается, они толкаются, поэтому для каждой рекурсии мы получаем «стек» значений параметров для каждого итерационного вызова. Это хорошо работает с рекурсией, потому что разные ветви не разрушают другие значения (выскакивание происходит в конце вызова функции и только выскакивает значения, которые вызвал вызов).
Использование сложных глобальных структур данных. Они по существу сохраняют параметры вне вызова функции и позволяют выполнять более сложные вещи (например, использовать очередь вместо стека), но требуют больше работы. Поскольку они являются внешними по отношению к функции, они могут быть просмотрены другими ветвями, если это необходимо.
Все, что вам нужно сделать, это объявить глобальный int и затем увеличить его в вызове функции. Каждый раз, когда функция вызывается, значение увеличивается и, следовательно, подсчитывает количество вызовов функций. Поскольку он только увеличивается, у нас нет проблем с ветвлением (так как каждая ветка будет делать то же самое и, следовательно, быть неразличимой).
int count = 0;
void ToH(int dskToMv, int cLocation, string orpeg, int tmpLocation, string expeg, int fLocation, string depeg)
{
count++;
if(dskToMv != 0)
{
ToH(dskToMv-1, cLocation, orpeg, fLocation, depeg, tmpLocation, expeg);
cout<<" Move one disk from the "<< orpeg << " to the " << depeg
<< " " << cLocation << " -> " << fLocation << " - " << count << endl;
ToH(dskToMv-1, tmpLocation, expeg, cLocation, orpeg, fLocation, depeg);
}
}
В качестве альтернативы, если вы хотите, чтобы для возвратов и, следовательно, на самом деле считать «уровни», вы можете просто использовать параметр:
void ToH(int dskToMv, int cLocation, string orpeg, int tmpLocation, string expeg, int fLocation, string depeg, int count = 0)
{
if(dskToMv != 0)
{
ToH(dskToMv-1, cLocation, orpeg, fLocation, depeg, tmpLocation, expeg, count + 1);
cout<<" Move one disk from the "<< orpeg << " to the " << depeg
<< " " << cLocation << " -> " << fLocation << " - " << count << endl;
ToH(dskToMv-1, tmpLocation, expeg, cLocation, orpeg, fLocation, depeg, count + 1);
}
}
Не все методы одинаковы. Когда вы научитесь думать о рекурсии как о «поиске» в большой структуре ветвящихся данных, легче думать об этих вещах. Когда вы используете только простую рекурсию, эквивалентную итерации, то между этими разными методами нет большого различия.
Добавить еще 'INT step' параметра для' ToH() ', который увеличивается в каждом вызове. –
Мне нужна петля? –
Может быть, цикл будет лучше, чем рекурсия, но вам не нужен один нет. –