Как реализовать облачную функцию Google с использованием подхода функционального программирования? - PullRequest
0 голосов
/ 07 февраля 2019

Недавно у меня появилась облачная функция Google с рекурсивным и хвостовым рекурсивным способом реализации.Таким образом реализуется подход функционального программирования.

Простая рекурсивная функция в Python:

def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n-1)

Простая хвостовая рекурсивная функция в Python:

def factorial(n, acc=1):
    if n == 0:
        return 1
    else:
        return factorial(n-1, acc*n)

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Облачные функции - это все еще обычные функции, которые вы можете использовать.Вам не нужно делать повторные HTTP-запросы, вам просто нужно предоставить аргумент функции, когда вы вызываете ее рекурсивно, которая имитирует аргументы, которые будут внедрять облачные функции.

Например, вот ваш первый пример какHTTP-триггер:

class MockRequest:
    def __init__(self, args):
        self.args = args

def factorial(request):
    n = request.args.get('n')
    if n == 0:
        return 1
    else:
        return n * factorial(MockRequest({'n': n-1}))

Хвостовая рекурсия была бы похожа.

0 голосов
/ 07 февраля 2019

Функция Google Cloud - рекурсивная функция:

# import request
import urllib.request as req

def recursive(request):
    url = "https://<google-cloud-function-domain-url>/function-rec"
    # check the url arg `n` 
    if request.args and 'n' in request.args:
        n = int(request.args.get('n'))
        if n <= 0:
            return str(0)
        else:
            complete_url = url + "?n=" + str(n-1)
            n_1_result = req.urlopen(complete_url).read()
            return str(n + int(n_1_result))
    else:
        return f'Please send the `n` value in the argument!'

Функция Google Cloud - хвостовая рекурсивная функция:

# import redirect
from flask import redirect

def recursive(request):
    url = "https://<google-cloud-function-domain-url>/function-rec-redirect"
    # check the url arg `n` and `acc` else if with `n` arg
    if request.args and 'n' in request.args and 'acc' in request.args:
        n = int(request.args.get('n'))
        acc = int(request.args.get('acc'))
        if n <= 0:
            return str(acc)
        else:
            complete_url = url + "?n=" + str(n-1) + "&acc=" + str(n + acc)
            return redirect(complete_url, code=307)
    elif request.args and 'n' in request.args:
        n = int(request.args.get('n'))
        if n <= 0:
            return str(0)
        else:
            complete_url = url + "?n=" + str(n-1) + "&acc=" + str(n)
            return redirect(complete_url, code=307)
    else:
        return f'Please send the `n` value in the argument!'

Существуют разные сценарии, в которых мы можем использовать эту реализацию рекурсивного функционального подхода в облакеФункция.!

...