关于幂和的算法

时间:2018-08-09 15:35:45

标签: python algorithm

我正在处理下面显示的问题,第2部分。但是,当我在python中实现它时,它失败并显示“ RecursionError:超过最大递归深度”。 enter image description here

这是我的算法:

import math
def sumofpowers2(x):
    count = 1
    if math.isclose(x ** count,0,rel_tol=0.001):
        return 0
    count += 1
    return 1 + x * sumofpowers2(x)

print(sumofpowers2(0.8))

已编辑。

2 个答案:

答案 0 :(得分:2)

简而言之,sumofpowers2(x)使用相同的参数调用自身,从而导致无限递归(除非if条件从一开始就成立,否则它将永远不会成立)。

每次sumofpowers2()进行自我调用时,都会创建一个名为count的新变量并将其设置为1。为了使此代码正常工作,您需要找出一种在调用之间传递count值的方法。

答案 1 :(得分:0)

首先,请学习基本调试:添加一个简单的print即可在依赖它们之前跟踪您的值:

def sumofpowers2(x):
    count = 1
    print(x, count, x**count)
    if math.isclose(x ** count,0,rel_tol=0.001):
        ...

输出:

(0.8, 1, 0.8)
(0.8, 1, 0.8)
(0.8, 1, 0.8)
...

这指出了一个关键问题:每次进入例程,都将count重置为1。简单的解决方法是在循环之外进行初始化:

count = 1

def sumofpowers2(x):
    global count
    print(x, count, x**count)
    if math.isclose(x ** count,0,rel_tol=0.001):

输出:

0.8 1 0.8
0.8 2 0.6400000000000001
0.8 3 0.5120000000000001
0.8 4 0.4096000000000001
0.8 5 0.3276800000000001
0.8 6 0.2621440000000001
0.8 7 0.20971520000000007
0.8 8 0.1677721600000001
0.8 9 0.13421772800000006
0.8 10 0.10737418240000006
0.8 11 0.08589934592000005
0.8 12 0.06871947673600004
0.8 13 0.054975581388800036
0.8 14 0.043980465111040035
0.8 15 0.03518437208883203
0.8 16 0.028147497671065624
0.8 17 0.022517998136852502
0.8 18 0.018014398509482003
0.8 19 0.014411518807585602
0.8 20 0.011529215046068483
0.8 21 0.009223372036854787
0.8 22 0.00737869762948383
0.8 23 0.005902958103587064
0.8 24 0.004722366482869652
0.8 25 0.0037778931862957215
0.8 26 0.0030223145490365774
0.8 27 0.002417851639229262
0.8 28 0.0019342813113834097
0.8 29 0.0015474250491067279
0.8 30 0.0012379400392853823
0.8 31 0.0009903520314283058
4.993810299803575

更妙的是,为函数添加count

def sumofpowers2(x, count):
    print(x, count, x**count)
    if math.isclose(x ** count,0,rel_tol=0.001):
        return 0
    return 1 + x * sumofpowers2(x, count+1)

不是您的级联算术不是您期望的值。