L oop через файлы и папки рекурсивно в Go - не могу понять, как происходит рекурсия - PullRequest
0 голосов
/ 06 мая 2020

Пример 1. (я могу понять рекурсию в этом коде, функция findFactorial вызывается внутри)

package main

import "fmt"
var repeated = 0

func main() {
    fmt.Println("Answer :",findFactorial(3))

}

func findFactorial(x int) int {
    repeated ++
    fmt.Printf("Repeating.., Now repeated %v times\n",repeated)
    if x == 0 {
        return 1
    }
    return x * findFactorial(x-1) // it is evident that this same function is calling again 

}

Вывод

go run .\factorial.go     
Repeating.., Now repeated 1 times
Repeating.., Now repeated 2 times
Repeating.., Now repeated 3 times
Repeating.., Now repeated 4 times
Answer : 6

Пример 2. (Здесь я не могу понять, как происходит рекурсия)

package main

import (
    "fmt"
    "log"
    "os"
    "path/filepath"
)
var repeated = 0
func main() {

    iterate("../../../../TEMP")
}

func iterate(path string) {
    fmt.Println("path",path)
    filepath.Walk(path, func(x string, info os.FileInfo, err error) error {
        repeated ++
        fmt.Printf("Repeating.., Now repeated %v times\n",repeated)
        if err != nil {
            log.Fatalf(err.Error())
        }
        fmt.Printf("File Name: %s\n", info.Name())
        return nil
    })
}

Вывод

go run .\filepathwalktu.go
path ../../../../TEMP
Repeating.., Now repeated 1 times
File Name: TEMP
Repeating.., Now repeated 2 times
File Name: PNR.png
Repeating.., Now repeated 3 times
File Name: tkt.png
Repeating.., Now repeated 4 times
File Name: understand this.txt

1 Ответ

3 голосов
/ 06 мая 2020

Второй пример не является рекурсией (по крайней мере, с точки зрения пользователя). Вы просто используете API с обратным вызовом. filepath.Walk - это стандартная библиотечная функция, которая принимает функцию в качестве аргумента. В этом примере обратный вызов - это закрытие или анонимно определенная функция. Этот обратный вызов вызывается, когда filepath.Walk находит новую запись в файловой системе. Внутренне filepath.Walk может или не может быть реализовано как рекурсия.

На всякий случай вот пример использования функции в качестве аргумента, не имеющего ничего общего с рекурсией:

func foo(cb func(int)) {
    // cb is a function that passed as an argument 
    // it is called 3 times without any recursion
    cb(0)
    cb(1)
    cb(2)
}

func main() {
    foo(func(i int) {
        fmt.Println("hello,", i)
    })
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...