【问题标题】:Finding whether a list is in descending order or not查找列表是否按降序排列
【发布时间】:2016-08-10 15:16:10
【问题描述】:

我目前正在学习递归函数,我已经部分解决了这个问题。

例如,如果输入是 [4,4,3],则输出应该为真。后续元素必须至少与前一个元素一样大。

这是我的代码:

def descending(l):
    x=0
    if len(l)==0 or len(l)==1:
        return True
    for value in range(0,len(l)):
         if l[value]>=l[value]+1:
             x=l[value]+1
             descending(l[x:len(l)])
             return True
         else:
             return False

请告诉我为什么我的逻辑在某些情况下会失败。

【问题讨论】:

  • 为什么将x 设置为l[value] + 1(列表中的值之一),然后尝试将其用作下一行的索引(x:len(l))?跨度>
  • 这是我关于递归的唯一问题。我的其他问题如下:为什么要对这个问题使用递归?它不太适合它。为什么要使用尴尬的 for value in range(0, len(l)) 而不是直接迭代列表中的值? (当它显然是一个索引时,你称它为 value 也令人困惑......)x 的目的是什么?
  • 完全偏离主题,但请不要使用 l 作为变量名 - 它看起来太像 1
  • 我认为在比较前 2 个元素之后,我必须从该元素开始传递列表。这就是为什么我分配 x 下一个值并从那时开始开始我的列表

标签: list python-3.x recursion


【解决方案1】:

如果你希望这个函数是递归的,它应该看起来像这样:)

def descending(l):
    if len(l) <= 1 or (len(l) == 2 and l[0] >= l[1]):
        return True
    else:
        if l[0] >= l[1]:
            return descending(l[1::])
        else:
            return False

【讨论】:

  • 是的,很抱歉这个错误
  • 好的,现在考虑一个空列表...检查len(l) &lt; 2怎么样?在处理范围时,检查不等式通常比检查等式更安全。
【解决方案2】:

如果你想使用递归,你可以这样做:

def foo(l):
    if len(l) <= 1:
        return True
    f, *l = l
    return False if f < l[0] else foo(l)

但我强烈不建议您对此类问题使用递归。

语法小注释:f, *l = l 将设置fl 的第一个元素并将l 设置为l 的其余部分,与:f, l = l[0], l[1:] 相同

【讨论】:

  • 欢迎来到 Stack Overflow!虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。不鼓励仅使用代码回答。
【解决方案3】:

对我来说,你的代码的主要失败是 descending() 返回一个值,但是当你递归调用它时,你忽略了它的返回值!

我不确定之前的哪个答案比另一个更Pythonic,但我不喜欢他们的风格。我会首先清楚地列出你的基本情况,然后以递归结束:

def descending(array):
    if len(array) <= 1:
        return True

    if array[0] < array[1]:
        return False

    return descending(array[1:])

我也对 return-else-return 逻辑有一个个人挂断:

if x:
     return a
else:
     return b

对比简单地说:

if x:
    return a
return b

【讨论】:

    【解决方案4】:
    def decreasing(l):
        if l==[] or len(l) == 1:
            return(True)
        else:
            return( decreasing(l[1:]) if l[0] > l[1] else False)
    

    【讨论】:

      【解决方案5】:

      我认为您的代码有效,但它可能更容易成为 Pythonic。

      def descending(l):
          if not l or len(l) == 1:
              return True
          elif l[0]>=l[1]:
               return descending(l[1:])
          else:
               return False
      

      【讨论】:

      • 去掉“l中的值”后的括号就可以了!
      • @Sygmei 为什么会这样?如果l 是一个简单的一维列表,这将与ValueError: Too many values to unpack 一起爆炸
      • 我只是注意到通过删除括号并尝试:P
      • 对不起,我想它现在已经修复了。我错过了枚举函数:)
      • 在@Sygmei 的一些启发下,我现在做得更好了,但我认为我的更清晰:)
      猜你喜欢
      • 2018-04-25
      • 1970-01-01
      • 2012-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-11
      • 2011-05-10
      • 1970-01-01
      相关资源
      最近更新 更多