【发布时间】:2022-07-17 20:59:00
【问题描述】:
我正在尝试使用函数式编程解决黑客等级的“网格搜索”问题。请查看hackerrank上的问题描述。 https://www.hackerrank.com/challenges/the-grid-search/problem
我只想使用递归和函数式编程原语,例如 map、filter 等。我当前的解决方案检查它是否可以在数组的开头找到模式,如果不能,那么我递归调用在数组的尾部。我想出了以下几点:
def checkLine(str1, str2):
return str1 in str2
def checkGroup(group1, group2):
return False not in list(map(lambda x: checkLine(x[0], x[1]), zip(group1, group2)))
def gridSearch(G, P):
# Write your code here
if len(G) < len(P):
return "NO"
if checkGroup(P, G):
return "YES"
else:
return gridSearch(G[1:], P)
问题是当两个数组都非常大时,我遇到了堆栈溢出。我知道您可以通过使用尾递归来避免堆栈溢出,但我不太确定如何在这里实现。谁能举例说明如何在功能上解决这个问题,同时避免堆栈溢出?
【问题讨论】:
-
您可以增加递归限制,但这样做会导致 HackerRank 返回错误答案。你确定你的代码是正确的吗?
-
" 我知道你可以通过使用尾递归来避免堆栈溢出" 你不能。 CPython 不进行尾调用优化。实际上,您的网格搜索功能已经是尾递归的。从根本上说,当你想使用深度递归时,你应该只在 Python 中使用迭代。 Python 不是函数式编程语言(尽管它借鉴了范式,例如列表推导式)。
-
@BrokenBenchmark 它通过了大约 10 个测试用例,但其他输入非常大的测试用例却失败了。感谢您的回复。我现在看到我写的函数已经是尾递归了。
标签: python recursion functional-programming