我有一个简单的代码,如:
p = soup.find_all("p")
paragraphs = []
for x in p:
paragraphs.append(str(x))
Run Code Online (Sandbox Code Playgroud)
我试图转换我从xml获得的列表并将其转换为字符串.我想保留它的原始标签,以便我可以重用一些文本,因此我之所以如此追加它.但是该列表包含超过6000个观测值,因此由于str而发生递归错误:
"RuntimeError:调用Python对象时超出了最大递归深度"
我读到你可以改变最大递归但这样做并不明智.我的下一个想法是将转换分为500个批次,但我相信必须有更好的方法来做到这一点.有人有建议吗?
我编写了以下递归函数,但由于最大递归深度而导致运行时错误.我想知道是否有可能编写一个迭代函数来克服这个问题:
def finaldistance(n):
if n%2 == 0:
return 1 + finaldistance(n//2)
elif n != 1:
a = finaldistance(n-1)+1
b = distance(n)
return min(a,b)
else:
return 0
Run Code Online (Sandbox Code Playgroud)
我试过的是这个,但似乎没有用,
def finaldistance(n, acc):
while n > 1:
if n%2 == 0:
(n, acc) = (n//2, acc+1)
else:
a = finaldistance(n-1, acc) + 1
b = distance(n)
if a < b:
(n, acc) = (n-1, acc+1)
else:
(n, acc) =(1, acc + distance(n))
return acc
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个函数来查找产生指定金额的所有可能的硬币组合,例如它计算所有可能的方式来从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) 今天类中递归和堆栈溢出的有趣话题,我想知道是否有任何方法可以增加Python中的最大递归深度?写了一个快速函数,用于使用递归查找n的阶乘:
def factorial(n):
if n == 1:
return n
else:
return n * factorial(n-1)
Run Code Online (Sandbox Code Playgroud)
它可以应对阶乘(994)而不是阶乘(995).给出的错误是:
RuntimeError: maximum recursion depth exceeded in comparison
Run Code Online (Sandbox Code Playgroud)
显然,可以迭代地找到更高的阶乘,但是,为了论证和阴谋,最大递归深度可以增加吗?
我创建了一个迭代函数,输出4 3 2 1 0 1 2 3 4.
def bounce2(n):
s = n
for i in range(n):
print(n)
n = n-1
if n <= 0:
for i in range(s+1):
print(-n)
n = n-1
return
bounce2(4)
Run Code Online (Sandbox Code Playgroud)
如果我想要一个完全相同的递归函数,我该怎么想?
我见过关于自引用 Pydantic 模型导致的类似问题,RecursionError: maximum recursion depth exceeded in comparison但据我所知,代码中不包含自引用模型。我只是使用 Pydantic 的BaseModel类。
代码成功运行,直到audit.py下面的函数尝试从模型返回输出。
我已经包含了完整的回溯,因为我不确定从哪里开始处理这个错误。我在没有 IDE 的情况下使用 PyCharm 运行了代码,它总是生成下面的回溯,但不会使应用程序崩溃,而是向前端返回 500 的 http 状态代码。
\n任何建议将不胜感激。
\n正如所建议的,我还尝试sys.setrecursionlimit(1500)增加递归限制。
main.py
import uvicorn\nfrom fastapi import FastAPI\nfrom starlette.middleware.cors import CORSMiddleware\n\n\nfrom app.api.routes.router import api_router\nfrom app.core.logging import init_logging\nfrom app.core.config import settings\n\ninit_logging()\n\n\ndef get_app() -> FastAPI:\n application …Run Code Online (Sandbox Code Playgroud) 我有这个递归阶乘函数:
def factorial(n):
if n < 2:
return 1
return n * factorial(n-1)
Run Code Online (Sandbox Code Playgroud)
正在做factorial(998)工作,但factorial(999)会提高RecursionError: maximum recursion depth exceeded in comparison.
为什么它在factorial(999)和 上出错而不是1000or 1001?factorial(1)达到基本情况,因此调用函数时应该只有一个堆栈帧factorial,factorial(2)递归一次,因此应该使用 2 个堆栈帧,依此类推。
递归限制是排他的还是包含的?例如,当达到1000 个堆栈帧或超过setrecursionlimit(1000)1000 个堆栈帧时,是否会出错?
如果它是排他性的,为什么它会出错n=999而不是出错n=1000?n=999应该创建 999 帧,而不是 1000。额外的堆栈帧从哪里来,使它达到 1000?如果包含限制,那么额外的 2 个堆栈帧从何而来,使其达到 1001 个堆栈帧?
我正在尝试制作一个程序来找到1 <n <10 ^ 19的第n个Fibonacci数.
这是我使用动态编程的代码.
memo = {}
def fib(n):
if n in memo:
return memo[n]
if n <= 2:
f = 1
else:
f = fib(n-1) + fib(n-2)
memo[n]=f
return f
print fib(input()) % 1000000007
Run Code Online (Sandbox Code Playgroud)
我的代码似乎不适用于大数字.我得到无效的响应错误.有什么建议?
所以我一直在做这个家庭作业问题几个小时,我会尽力解释它.
我需要在python中编写一个程序来获取列表并在列表中的第一个项目处启动,您可以向前移动一个空格或跳过一个项目并在其另一侧着陆,每个项目都会降低成本该位置的号码.目标是尽可能便宜地达到目的.
我写了这个函数,
def player(cost, board, player_pos):
if player_pos == (len(board)) - 1:
return cost
if player_pos < (len(board)) - 2:
if board[player_pos + 1] > board[player_pos + 2]:
return player(cost + board[player_pos + 2], board, player_pos + 2)
else:
return player(cost + board[player_pos + 1], board, player_pos + 1)
elif player_pos == (len(board)) - 2:
return (cost + board[player_pos] + board[player_pos + 1])
Run Code Online (Sandbox Code Playgroud)
但它无法看到接下来的两个位置,所以它可能会出错.一个很好的例子是这个列表[0,1,2,1000,0]我的程序输出3因为它选择1超过2,然后超过1000,然后是0.这加起来为3,但最快的方法是跳转到2,然后到0.
在家庭作业中它表示可能需要很长时间来运行长列表,我猜他们希望我尝试每种可能的跳转组合并选择最便宜的组合,但我不知道如何使用递归.
编辑: 所以这是我根据评论做出的改进,它适用于我教授的所有例子.给了我除了一个,这是它没有返回他说的应该的列表.[0,98,7,44,25,3,5,55,46,4]他说它应该返回87,但我调整后的程序返回124.这是新代码:
def player(cost, board, player_pos):
if player_pos == (len(board)) - 1:
return cost …Run Code Online (Sandbox Code Playgroud) 有一种简单的转换方式
t = ((1,), (1, 2), (1, 2, 3), (1, 2, 3, 4), (1, 2, 3, 4, 5))
Run Code Online (Sandbox Code Playgroud)
到下面的递归结构,其中每个后续元组作为前一元组的元素被附加
(1, (1, 2, (1, 2, 3, (1, 2, 3, 4, (1, 2, 3, 4, 5)))))
Run Code Online (Sandbox Code Playgroud)
这种嵌套的限制是什么?我可以拥有1000或10000个这样的嵌套元组吗?
更新:似乎t嵌套是无限的(在将递归限制设置为100后尝试使用10000).
在Window 7上,Python 3.5)最初的递归限制大约为300,但可以作为(引用)提升.这与结构无关t,但可能与Python例程访问结果结构的嵌套级别有关.
sys.getrecursionlimit() # display current recursion level
sys.setrecursionlimit(10000) # set recursion level to 1000
Run Code Online (Sandbox Code Playgroud) python ×10
recursion ×6
algorithm ×2
python-3.x ×2
backtracking ×1
fastapi ×1
fibonacci ×1
loops ×1
pydantic ×1
python-2.7 ×1
uvicorn ×1