如何使用 2 个累加器编写递归函数?

问题描述 投票:0回答:0

我是 Python 的新手,递归对我来说是一个陌生的东西。对于我的作业,如果函数需要使用尾递归、while 循环或生成器来实现,我有涉及尾递归、while 循环或由 _t、_w 或 _g 指定的生成器的函数。

我的 p 函数和 d 函数产生了正确的答案,但我的 c 函数有问题。我附上了所有函数的图片,以显示 c 函数的外观。 correct p functions incorrect c functions (NOTE: def c(n) was given to me so it is the only correct function so far correct d functions Here is the original problem information for all of the functions which also explains the base functions

我的完整代码: 定义 p(n): 如果 n: 返回 p(n-1) + 0.02*p(n-1) 别的: 返回 10000

#MUST be implemented with tail recursion
def p_t(n, acc=10000):
if n == 0:
    return acc
else:
    return p_t(n - 1, acc * 1.02)

#MUST be implemented with a WHILE LOOP
def p_w(n, acc=10000):
while n > 0:
    acc = acc * 1.02
    n = n - 1
return acc

#MUST be implemented with generator
def p_g():
p = 10000
yield p
while True:
   p = p + (0.02 * p)
   yield p

def c(n):
if n > 1:
    return 9*c(n-1) + 10**(n-1) - c(n-1)
else:
    return 9

#MUST be implemented with tail recursion
def c_t(n, acc1=9, acc2=0):
 if n == 1:
    return acc1
 else:
    return c_t(n - 1, 9 * acc1 + 10 ** (n - 2) - acc2, acc1)
    
#MUST be implemented with a WHILE LOOP
def c_w(n, acc1=9, acc2=0):
while n > 1:
    acc1, acc2 = 9 * acc1 + 10 * (n - 2) - acc2, acc1
    n = n - 1
return acc1

#MUST be implemented with generator
def c_g():
c = 9
yield c
i = 2
while True:
    c = 9 * c + 10 * (i - 1) - c
    yield c
    i = i + 1

def d(n):
if n:
    return 3*d(n-1) + 1
else:
    return 1

#MUST be implemented with tail recursion
def d_t(n, acc=1):
if n == 0:
    return acc
else:
    return d_t(n - 1, 3 * acc + 1)

#MUST be implemented with a WHILE LOOP 
def d_w(n, acc=1):
if n == 0: 
    return 1
else:
    x = 1
    while x <= n:
        acc = 3 * acc + 1
        x = x + 1
    return acc

#MUST be implemented with generator
def d_g():
d, n = 1, 1
yield d
while True:
    d = 3 * d + 1
    yield d
    n = n + 1

所有功能的测试用例是:

#for i,j in zip(range(5),p_g()):
#     print(p(i),p_t(i),p_w(i),j)

# 10000 10000 10000 10000
# 10200.0 10200.0 10200.0 10200.0
# 10404.0 10404.0 10404.0 10404.0
# 10612.08 10612.08 10612.08 10612.08        
# 10824.3216 10824.3216 10824.3216 10824.3216

# for i,j in zip(range(1,7),c_g()):
#     print(c(i),c_t(i),c_w(i),j)

# 9 9 9 9
# 82 82 82 82
# 756 756 756 756
# 7048 7048 7048 7048
# 66384 66384 66384 66384
# 631072 631072 631072 631072


# for i,j in zip(range(5),d_g()):
#     print(d(i),d_t(i),d_w(i),j)
# 1 1 1 1
# 4 4 4 4
# 13 13 13 13
# 40 40 40 40
# 121 121 121 121

但是对于我的 c 函数,而不是获取

#9 9 9 9
#82 82 82 82
# 756 756 756 756
# 7048 7048 7048 7048
# 66384 66384 66384 66384
# 631072 631072 631072 631072 

对于所有函数,我的都返回(每行中的第 0 个位置是正确的):

#9 9 9 9
#82 82 81 82
#756 811 810 676
#7048 14490 8089 5438
#66384 775962 79891 43544
#631072 64414531 781220 348402
python function while-loop generator tail-recursion
© www.soinside.com 2019 - 2024. All rights reserved.