python - Python以给定的索引跳转或更少的方式递归地跳过列表,同时避免零
问题描述
我正在尝试编写一个只有一个参数的函数,一个正整数列表。
它必须是递归的,并找出是否可以从头到尾同时避免落在 0 上。它必须从第一个值开始,list[0]
但您可以跳跃全部或更少。
例如
list1 = [3,1,2,0,4,0,1]
list2 = [3,2,1,0,2,0,2]
列表 1 应该返回True
,因为您可以从 3 跳到 2 再从 4 跳到 1。
清单 2 应该返回False
,因为无论您如何跳跃,您都会在第一个 0 处着陆。
到目前为止,这是我的尝试:
def check_level(level):
jump = level[0]
if level[-1] == 0:
return False
elif jump == 0:
return False
elif jump == 0:
return False
elif len(level) > 1:
if level[jump] > len(level):
return True
elif level[-1] == 0:
return False
elif level[0] != 0:
if level[jump] == 0:
level[0] -= 1
return check_level(level)
else:
jump_index = level.index(level[jump])
new_level = level[jump_index:]
return check_level(new_level)
else:
return True
它不适用于所有示例,并且与其他示例一起出现错误:
if level[jump] > len(level):
TypeError: '>' not supported between instances of 'list' and 'int'```
I am out of ideas on how to approach this and whether my approach is failed from the start... I hate recursion, hence I need to practice it.
解决方案
一般逻辑是:
“如果你能跳到一个True位置,那么当前位置也是True”
像这样实现:
def checklevel(lst):
if not lst:
# no list is True (we are done)
return True
return any( checklevel(lst[i:]) for i in range(1,lst[0]+1))
list1 = [3,1,2,0,4,0,1]
list2 = [3,2,1,0,2,0,2]
assert checklevel(list1)
assert not checklevel(list2)
请注意,这对于大型列表来说是一个糟糕的解决方案,在这种情况下您应该尝试迭代 dp-table。
推荐阅读
- visual-studio-code - 任务“:app:splitsDiscoveryTaskDebug”执行失败
- android - Android Studio中无用滚动条的GridView问题
- javascript - 我可以在 app.get 中使用不同路径的 app.use
- redis - 如果您不小心写入从服务器,Redis Sentinel 的预期行为是什么
- php - 创建 json 数组时,如果文本有特殊字符,则不显示任何内容
- r - 如何从 uGARCHfit(rugarch 包)中提取 AIC
- html - 垂直对齐不是像素完美的
- c++ - 可以将 GCC 配置为忽略 #pragma 指令吗?
- javascript - 打印任何 javascript 对象
- c++ - 使用 SDL_mixer 播放 .ogg 文件时出现问题