How to convert a function to a recursive function

Question:

Hey guys I don’t know if I can ask this but I’m working on the original files in google collab and I wrote a function that sums all the sizes of the file

import os
def recls_rtsize(argpath):
  sumsize = 0
  for entry in os.scandir(argpath):
    path= argpath+'/'+entry.name
    size= os.path.getsize(path)
    sumsize+=size
  return sumsize
print("total:",recls_rtsize('/var/log'))

But I need a way to make this function a recursive function or if there is some kind of formula or idea to convert no-recursive into recursive

Asked By: HAZEM

||

Answers:

For example, you could write helper function to process it recursively, although I don’t understand the purpose:

import os


def recls_rtsize(argpath):
    def helper(dirs):
        if not dirs:
            return 0
        path = argpath + '/' + dirs[0].name
        size = os.path.getsize(path)
        return size + helper(dirs[1:])

    return helper(list(os.scandir(argpath)))


print("total:", recls_rtsize('testing_package'))

Explanation:

Let’s say argpath contains several files:

argpath = [file1, file2, file2]

Then the function calls would be:

size(file1) + recls_rtsize([file2, file2]) we pass everything after the first element

size(file1) + size(file2) + recls_rtsize([file3])

size(file1) + size(file2) + size(file3) + recls_rtsize([])
There are no elements left, and we return 0 and start backtracking

size(file1) + size(file2) + size(file3) + 0

size(file1) + size(file2) + (size(file3) + 0)

size(file1) + (size(file2) + (size(file3) + 0))

(size(file1) + (size(file2) + (size(file3) + 0))) # our result

I hope it make sense

Answered By: funnydman

To iterate over files in sub-folders (I assume that this is your goal here) you can use os.walk().

example

Answered By: LITzman

Recursive function is the function which calls itself. For example if You are trying to calculate the sum of all files inside some directory You can just loop through files of that directory and summarize the sizes of the files. If directory You are checking for has subdirectories, then you can just put a condition, if directory has subdirs, if it is, then you can call function itself for that subdirectory.

In your case:

import os

def recls_rtsize(argpath):
  sumsize = 0
  for entry in os.scandir(argpath):
    # think of is_directory is your custom function that checks 
    # if this path is a directory
    if entry.is_directory():
      # then call your function for this directory
      size = recls_stsize(entry)
    else:
      path = argpath+'/'+entry.name
      size = os.path.getsize(path)
    sumsize += size
  
  return sumsize

print("total:",recls_rtsize('/var/log'))
Answered By: Ubaydullo Ibrohimov
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.