【发布时间】:2020-06-25 09:42:44
【问题描述】:
我正在尝试使用递归来解决这个问题https://leetcode.com/problems/2-keys-keyboard/。我初始化了 2 个变量屏幕和缓冲区。 screen 表示屏幕上所有字符的计数,buffer 表示上一步复制的所有字符的计数
所以当我们复制时函数是这样调用的 - 功能(屏幕,屏幕)
和粘贴意味着 - 函数(屏幕+缓冲区,缓冲区)
但这不起作用这是代码-
def keyboard(screen,buffer, c,n):
if screen == n:
return c
if screen>n:
return
if buffer>n:
return
keyboard(screen+buffer,buffer,c+1,n)
keyboard(screen,screen,c+1,n)
print(keyboard(1,0,0,8))
我得到了最大的递归深度 这是记忆方法
def keyboard(self,screen,buffer,c,n,dp):
large_num = 100000 # larger than possible moves
if dp[screen][buffer] != -1:
return dp[screen][buffer]
if screen == n:
return c
if screen>n:
return large_num
if buffer>n:
return large_num
if c > n:
return large_num
dp[screen][buffer] = min(self.keyboard(screen,screen,c+1,n,dp), self.keyboard(screen+buffer,buffer,c+1,n,dp))
return dp[screen][buffer]
def minSteps(self, n: int) -> int:
dp = [[-1 for i in range(n+1)] for j in range(n+1)]
return(self.keyboard(1,0,0,n,dp))
【问题讨论】:
-
如果递归是问题,请改用循环。
-
预期输出是什么?
-
您的
keyboard函数引用了一个不存在的“缓冲区”。NameError: name 'buffer' is not defined. -
您的递归调用
keyboard(1, 0, 0, 8)将无限循环运行。当您添加screen + buffer即keyboard(1 + 0, 0, 0, 8) will时,被称为keyboard(1, 0, 0, 8)一次又一次。而且在你的代码中也没有提到解决这个问题的条件。
标签: python algorithm recursion dynamic-programming