Рекурсия по сравнению с циклами

Сначала проверьте, что ваш файл .lnk находится в пути.

Затем (и наиболее вероятная причина вашей проблемы) проверьте, что ваше имя файла .lnk создано правильно. Чтобы убедиться, что это не похоже на «blender.lnk.lnk» (я могу воспроизвести вашу проблему, если я установил как это).

Вы также можете попытаться самостоятельно проанализировать путь к файлу ссылки. Вот пример:

void ShortcutToRealpath(LPWSTR pszString, LPSTR pdzString)
{
    IShellLink   *pShellLink;
    HRESULT hRes;

    ::CoInitialize(NULL);
    hRes = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void **)&pShellLink);
    if (SUCCEEDED(hRes))
    {
        IPersistFile   *ppf;
        hRes = pShellLink->QueryInterface(IID_IPersistFile, (void **)&ppf);
        if (SUCCEEDED(hRes))
        {
            hRes = ppf->Load(pszString, TRUE);
            if (SUCCEEDED(hRes))
            {
                pShellLink->GetPath(pdzString, MAX_PATH, NULL, 0);
            }
            ppf->Release();
        }
        pShellLink->Release();
    }
    ::CoUninitialize();
}

Когда я собираюсь как платформа x86, путь будет проанализирован следующим образом: enter image description here Вот почему ваша программа не может найти путь.

И если я выберу x64: enter image description here

Поместите целевой файл в соответствующий файл.

РЕДАКТИРОВАТЬ:

После того, как я протестировал его с помощью инструмента MS Procmom.exe , я нашел что-то другое, если он работает как 32-битный, он покажет: [ 1114] enter image description here

Значение ключа - C:\Program Files (x86), и если мы запустим его как 64-битный, ключ будет ссылаться на «HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ ProgramFilesDir» значение ключа C:\Program Files. После того, как я проверил реестр: enter image description here enter image description here Кажется, что C:\Program Files не отображается по умолчанию в 32-битном реестре (я не уверен насчет конкретной причины). Если вы измените ключ ProgramFilesDir на C:\Program Files в 32-битном реестре, проблема будет исправлена.

48
задан another 11 November 2016 в 05:33
поделиться

10 ответов

Я одобряю рекурсивные решения когда:

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

  • , меня можно обоснованно уверить, что глубина рекурсии не вызовет переполнение стека, предполагая, что мы говорим о языке, который реализует рекурсию этот путь

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

56
ответ дан John Feminella 7 November 2019 в 12:11
поделиться

Если бы система, Вы продолжаете работать, имеет маленький стек (встроенные системы), глубина рекурсии была бы ограничена, так выбор основанного на цикле алгоритма будет желаем.

0
ответ дан switchmode 7 November 2019 в 12:11
поделиться

Если Ваш код будет скомпилирован, то это будет, вероятно, иметь мало значения. Сделайте некоторое тестирование и посмотрите, сколько памяти используется и как быстро это работает.

0
ответ дан Jay 7 November 2019 в 12:11
поделиться

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

2
ответ дан Svante 7 November 2019 в 12:11
поделиться

Это доказуемо, что все рекурсивные алгоритмы хвоста могут быть развернуты в цикл, и наоборот. Вообще говоря, рекурсивная реализация рекурсивного алгоритма является более четкой следовать для программиста, чем реализация цикла и является также легче отладить. Также вообще говоря, реальное выполнение реализации цикла будет быстрее, как ответвление/переход в цикле обычно быстрее для выполнения, чем продвижение и сование стекового фрейма.

Лично разговор, для рекурсивных алгоритмов хвоста я предпочитаю придерживаться рекурсивной реализации во всех кроме most-performance-intensive ситуаций.

4
ответ дан Not Sure 7 November 2019 в 12:11
поделиться

Используйте цикл. Легче читать и понять (чтение кода всегда намного более трудно, чем запись его), и обычно намного быстрее.

7
ответ дан Emil H 7 November 2019 в 12:11
поделиться

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

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

9
ответ дан Ed S. 7 November 2019 в 12:11
поделиться

Рекурсия используется для выражения алгоритма, который является естественно рекурсивным в форме, которая более легко понятна. "Естественно рекурсивный" алгоритм является тем, где ответ создается от ответов до меньших подпроблем, которые в свою очередь создаются от ответов до еще меньших подпроблем, и т.д. Например, вычисляя факториал.

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

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

19
ответ дан Tyler McHenry 7 November 2019 в 12:11
поделиться

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

существует инструкция из классической книги Элементы Стиля программирования (Kernighan и Plauger), что алгоритм должен следовать за структурой данных. Таким образом, рекурсивные структуры часто обрабатываются более ясно с рекурсивными алгоритмами.

28
ответ дан RBerteig 7 November 2019 в 12:11
поделиться

Я сказал бы, что версия рекурсии лучше понятный, но только с комментариями:

Item Search(string desired, Scope scope) {
    // search local items
    foreach(Item item in scope.items)
        if(item.name == desired)
            return item;

    // also search parent
    return scope.Parent ? Search(desired, scope.Parent) : null;
}

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

3
ответ дан ypnos 7 November 2019 в 12:11
поделиться
Другие вопросы по тегам:

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