我在这里有这个尾递归函数:
def recursiveFunction(n, sum):
if n < 1:
return sum
else:
return recursiveFunction(n-1, sum+n)
c = 998
print(recursiveFunction(c, 0))
Run Code Online (Sandbox Code Playgroud)
它可以工作到n = 997,然后它就会中断并吐出"比较时超出的最大递归深度" RuntimeError.这只是一个堆栈溢出?有办法解决它吗?
我正在尝试编写一个函数来查找产生指定金额的所有可能的硬币组合,例如它计算所有可能的方式来从1p,2p,5p,10p的面额列表中更改2英镑的金额, 20P,50P,1pound,2pound.我坚持这个,找不到合适的解决方案.
我希望main函数是递归的,因为我想更好地理解递归.该算法必须回溯,如果在某个时刻发现的组合超过了要匹配的量,则程序应该返回到先前的步骤并从不同的点开始.
到目前为止,我已经编写了一个普通(非递归)函数,如果每个硬币仅使用一次,则计算给定国家中所有可能的硬币组合(这相当简单).我并没有试图找到一个给定数额的正确组合,只是所有可能的硬币组合.
def calcCoins(coins):
"""
returns all possible combinations of coins, when called with
[1,2,5,10,20,50,100,200] returns a list of 126 Counters containing
for instance Counter{1:1}, Counter{1:1,2:1,5:1}, Counter {50:1,100:1} etc
"""
i,combs = 1, []
while i < len(coins):
for x in combinations(coins,i):
combs.append(Counter(x))
i += 1
return combs
Run Code Online (Sandbox Code Playgroud)
现在我有一个笨拙的递归函数,它接受一个组合和所需的数量作为参数,并返回所有可能的方式,其中可以给出等于此数量的更改.
def findSum(comb,goal,rightOnes):
if rightOnes == None:
rightOnes = []
if sum(comb.elements()) == goal:
comb_ = Counter(comb)
if comb_ in rightOnes:
# probably a cycle, return combinations gathered and exit …Run Code Online (Sandbox Code Playgroud) 我走到了尽头,经过过度(不成功)谷歌搜索后,我需要帮助.
我正在构建一个简单的PyQt4 Widget,它位于一个60x80正方形的网格中,每个正方形被初始化为None.如果用户单击该框,则会根据此列表定义的左键单击次数更改颜色:
self.COLORS=[
(0, 0, 255), #WATER
(255, 210, 128), #SAND
(0, 128, 0), #GREEN
(255, 255, 0), #YELLOW
(255, 165, 0), #ORANGE
(255, 0, 0) #RED
]
Run Code Online (Sandbox Code Playgroud)
如果用户右键单击,则使用常见的递归填充算法泛洪填充区域.这适用于小空间,但是如果空间足够大,程序会因错误而失败,Fatal Python error: Cannot recover from stack overflow.我不知道如何解决这个问题,也许洪水填充不是递归的?
所有正方形和后续颜色代码都存储在其中,self.cells因此通过设置self.cells[(y,x)]=1将单元格设置(y,x)为Sand颜色.
这是整个程序.
import sys
from PyQt4 import QtGui, QtCore
class Example(QtGui.QWidget):
def __init__(self, cell_size=10, swidth=800, sheight=600):
QtGui.QWidget.__init__(self)
self.resize(swidth,sheight)
self.cell_size = cell_size
self.height = sheight
self.width = swidth
self.columns = self.width // …Run Code Online (Sandbox Code Playgroud) 我写了这段代码来计算组合数:
def fact(n):
return 1 if(n == 1) else n * fact(n - 1)
def combinations(n,k):
return fact(n)/((fact(n - k) * fact(k)))
while(True):
print(combinations(int(input()), int(input())))
Run Code Online (Sandbox Code Playgroud)
阶乘函数似乎工作正常。但是为什么当我尝试找到两个数字的组合时,它会给我一个最大递归深度超过比较错误?阶乘函数是否有问题,因为这似乎是错误的来源?
这是我得到的错误:
builtins.RuntimeError:相比之下超出了最大递归深度