Может ли кто-нибудь объяснить слово рекурсивный по отношению к компьютерам / программированию? Мне трудно понять его использование - PullRequest
0 голосов
/ 24 января 2020

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

EX: рекурсивно ищет HKLM Ключ SAM

Ответы [ 3 ]

1 голос
/ 25 января 2020

@ vekerdyb ответ прав: рекурсивно в терминах поиска обычно означает поиск на каждом (под) уровне . Конечно, рекурсия (в информатике) - это немного более универсальная (более общая) концепция (см. Также @ Maffe's answer ).

Принимая ваш пример как запрос задачи "рекурсивно искать HKLM по ключу SAM" , затем решение в Windows cmd может основываться на reg.exe утилите , см. также ( усеченный) отрывок из reg query /? help:

REG QUERY KeyName [/v [ValueName] | /ve] [/s]
          [/f Data [/k] [/d] [/c] [/e]] [/t Type] [/z] [/se Separator]
          [/reg:32 | /reg:64]

  /s       Queries all subkeys and values recursively (like dir /s).

  /f       Specifies the data or pattern to search for.
           Use double quotes if a string contains spaces. Default is "*".

  /k       Specifies to search in key names only.

  /c       Specifies that the search is case sensitive.
           The default search is case insensitive.

  /e       Specifies to return only exact matches.
           By default all the matches are returned.

Для объяснения /s switch рекурсивно (например, dir /s) см. dir /? | find /I " /s"

/S    Displays files <i>in specified directory</i> <b>and all subdirectories</b>.

Теперь вы можете увидеть разницу: поиск HKLM для ключа SAM ( не рекурсивно )

reg query HKLM /K /C /E /F SAM
HKEY_LOCAL_MACHINE\SAM
End of search: 1 match(es) found.

против поиск HKLM рекурсивно для ключа SAM :

reg query HKLM /K /C /E /F SAM /S
HKEY_LOCAL_MACHINE\SAM
HKEY_LOCAL_MACHINE\SAM\SAM
HKEY_LOCAL_MACHINE\SECURITY\SAM
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Audit\SystemPolicy\ObjectAccess\SAM
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\SAM
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\EventLog\System\SAM
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SAM
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\System\SAM
End of search: 8 match(es) found.
0 голосов
/ 24 января 2020

@ Maffe's ответ правильный, но, говоря о вашем примере, «рекурсивно» в терминах поиска обычно означает поиск по каждому уровню.

(я не знаю, что такое HKLM Key SAM в контексте вашего примера, поэтому вместо этого я буду использовать простой поиск в файловой системе.)

Если ваш рабочий каталог /home/user1 и вы ищете (не рекурсивно) файл test.txt, это означает что вы ищете файлы с именем /home/user1/test.txt.
Если вы ищете рекурсивно, это означает, что вы ищете текущий каталог /home/user1, и любые подкаталоги (например, /home/user1/documents), и любые подкаталоги подкаталогов (например, /home/user1/documents/tests), et c.

В псевдокоде:

define searchRecursively(path, filename):
  results := []
  for every file in path:
    if file.name is filename:
      add file to the list of results
    if file.type is directory:
      subresults := searchRecursively(file, filename) # this is why it is recursive
      add all elements of subresults to results
  return results
0 голосов
/ 24 января 2020

«Лучший способ понять рекурсию - это понять рекурсию».

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

В компьютерном программировании рекурсия происходит, когда вы вызываете функцию / метод из себя. Например, эта функция:

    function printHello() {

        print("Hello!")   //this prints "Hello!" on the console
        printHello()      //this starts from the beginning
    }

будет работать бесконечно, печатая «Hello!» бесконечное время.

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

В математике факториал n является произведением (n) (n-1) (n-2) (n-3) ...

В программировании мы можем вычислить факториал числа n с помощью рекурсивной функции следующим образом:

//recursive
var factorial = function(n) {
    if(n == 0) {
        return 1
    } else {
        return n * factorial(n - 1);
    }
}

console.log(factorial(num));
...