我是 Python 的新手,递归对我来说是一个陌生的东西。对于我的作业,如果函数需要使用尾递归、while 循环或生成器来实现,我有涉及尾递归、while 循环或由 _t、_w 或 _g 指定的生成器的函数。
我的 p 函数和 d 函数产生了正确的答案,但我的 c 函数有问题。我附上了所有函数的图片,以显示 c 函数的外观。
我的完整代码: 定义 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