Terence888 发表于 2024-11-4 16:56:50

递归代码如何修改

from functools import lru_cache
@lru_cache
def removeInvalidParentheses(self, s):
    if len(s) == 1 and s not in "()":
      return
    if len(s) < 2:
      return [""]
    res = set()
    if s == "(" and s[-1] == ")":
      res |= set()])
    for i in range(1, len(s)):
      a, b = removeInvalidParentheses(s[:i]), removeInvalidParentheses(s)
      res |= {i+j for i in a for j in b}
      print(res)
    p = len(max(res, key=len))
    return
removeInvalidParentheses(s)

代码报错如下,如何修改TypeError                                 Traceback (most recent call last)
<ipython-input-13-806560d14b0b> in <cell line: 17>()
   15   p = len(max(res, key=len))
   16   return
---> 17 removeInvalidParentheses()

TypeError: removeInvalidParentheses() missing 2 required positional arguments: 'self' and 's'

FishC 发表于 2024-11-4 17:00:09

你的代码中有几个问题需要修正:

1. **函数定义问题**:`removeInvalidParentheses` 函数定义中有一个 `self` 参数,但在调用时没有传递。这个函数看起来像是一个类的方法,但你在调用时没有实例化类。

2. **递归调用问题**:在递归调用中,`removeInvalidParentheses(s)` 应该传递一个参数 `s`,而不是空调用。

3. **逻辑问题**:在 `if s == "(" and s == ")"` 这行逻辑上有问题,因为一个字符串不可能同时等于 `"("` 和 `")"`。

4. **返回值问题**:函数没有返回任何值。

以下是修正后的代码示例:

from functools import lru_cache

@lru_cache
def removeInvalidParentheses(s):
    if len(s) == 1 and s not in "()":
      return {s}
    if len(s) < 2:
      return {""}
   
    res = set()
    if s == "(" or s == ")":
      res |= set()
   
    for i in range(len(s)):
      if s in "()":
            new_s = s[:i] + s
            res |= removeInvalidParentheses(new_s)
   
    # 过滤出最长的结果
    max_len = max(len(x) for x in res)
    return {x for x in res if len(x) == max_len}

# 示例调用
s = "()())()"
result = removeInvalidParentheses(s)
print(result)

在这个修正后的代码中:

- 移除了 `self` 参数,因为这个函数不需要类实例。
- 修正了递归调用,确保传递了参数 `s`。
- 修正了逻辑错误,确保条件判断正确。
- 添加了返回值,确保函数返回一个集合。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

jackz007 发表于 2024-11-4 17:23:23

本帖最后由 jackz007 于 2024-11-4 19:01 编辑

def removeInvalidParentheses(self, s):
          为何会有 self 参数,难道这是一个类方法?形式参数 self 在函数内一次都没有被使用!
          如果 removeInvalidParenthese() 是类方法的话,就不能这样来调用:
removeInvalidParentheses(s)
          应该这样调用:
self . removeInvalidParentheses(s)
页: [1]
查看完整版本: 递归代码如何修改