Python中递归定义的超操作序列

Python中递归定义的超操作序列,python,function,recursion,currying,integer-arithmetic,Python,Function,Recursion,Currying,Integer Arithmetic,我创建了一个简单的函数来迭代二进制运算,我想用它递归地定义整数超运算序列(序列、加法、乘法等等) 迭代函数为: # f : (int,int) -> int # x,y : int def right_iterate(f,x,y): a = x while y - 1 > 0: y = y - 1 x = f(a,x) return x 理想情况下,我想这样定义超操作序列: # H : int -> ( (int, i

我创建了一个简单的函数来迭代二进制运算,我想用它递归地定义整数超运算序列(序列、加法、乘法等等)

迭代函数为:

# f : (int,int) -> int
# x,y : int

def right_iterate(f,x,y):
    a = x
    while y - 1 > 0:
        y = y - 1
        x = f(a,x)
    return x
理想情况下,我想这样定义超操作序列:

# H : int -> ( (int, int) -> int )
# n,x,y : int

def H(n)(x,y):
    if n == 0:
        return x+1
    else:
        return right_iterate(H(n-1),x,y)
基本上是我正在处理的等式的精确翻译,但Python不支持这种翻译。我想我需要做一些类似于curry的事情,并定义一个函数
h(n,x,y)-->h(n)(x,y)
,但我不确定如何定义

我试过使用

# H : int -> ( (int,int) -> int )
# h : (int,int) -> int
# n,x,y : int

def H(n):
    def h(x,y):
        if n == 0:
            return y + 1
        else:
            return right_iterate(H(n-1),x,y)
    return h
这是不对的,但它似乎在正确的轨道上 当
n
为1时,其计算结果与

if y != 0:
    return x + y - 1
else:
    return x + y
n
为2时,其计算结果为`

if y != 0:
    return x * y - (y -1)
else:
    return x
根据对的快速研究,我猜您想要的是:

from operator import add

def right_iterate(f, a, b):
    c = a

    while b > 0:
        a = f(c, a)
        b -= 1

    return a

def H(n, a, b):
    if n == 0:
        return right_iterate(add, 1, b)

    if b == 0:

        if n == 1:
            return a

        if n == 2:
            return 0

        if n >= 3:
            return 1

    return H(n - 1, a, H(n, a, b - 1))

if __name__ == '__main__':
    print(H(0, 2, 3))  # 1 + 3
    print(H(1, 2, 3))  # 2 + 3
    print(H(2, 2, 3))  # 2 * 3
    print(H(3, 2, 3))  # 2 ** 3
    print(H(4, 2, 3))  # 2 ** 2 ** 2
输出

> python3 test.py
4
5
6
8
16
> 

你在问什么不清楚你想同时做多个操作吗?我想一次做一个操作。我试图递归地定义每个操作,使H(0)(x,y)=s(x),H(1)(x,y)=x+y,H(2)(x,y)=x*y,依此类推。@GovindaMalavipathirana H(n)应该是一个接受两个整数并输出一个整数的函数。您试图在这里实现一个开关,根据
H
函数的输入执行将不同,是吗?@GovindaMalavipathirana是的,
n
确定正在执行的操作。这是可行的,但我想使用
right\u iterate
来定义从序列中进行的加法、从加法中进行的乘法,等等。例如,
right_iterate(add,a,b)=a*b