【问题标题】:How do I decrement the length of an inputed string?如何减少输入字符串的长度?
【发布时间】:2018-11-10 15:49:43
【问题描述】:

我定义了一个返回位数的递归函数:

def counter(z, c = 0):

    z = len(z)
    if z == 0:
        return c
    else:
        return counter(z - 1,c + 1)

我知道在第二次调用时,该函数会将整数 3 的长度分配给 z。如何将前一个字符串减去一个字符,以便我的函数计算每个字符?

【问题讨论】:

  • 字符串像数组或列表一样被索引。例如。 z[:-1] 表示除最后一个字符之外的所有字符。
  • 可能if not z: return c 作为你的条件,return counter(z[1:], c+ 1) 作为你的递归......(虽然未经测试)......虽然为每个字符调用 len 是不是有点奇怪?
  • z 是一个整数吗?您不能在 int 上调用 len。 (如果z 是您可以调用len 的东西,那么在应该递归计算其输入长度的函数中使用len 似乎很奇怪。)
  • @user2357112 是的...我觉得z 应该是字符串,if not z 应该是返回条件,z[1:] 在递归调用中 - 似乎不适合使用len这里...
  • @JonClements 我还能在哪里将 z 的长度分配给它自己?

标签: python recursion counter


【解决方案1】:

不要做z=len(z),因为你需要原来的z 传递给递归调用。相反,请执行zl=len(z),将您的if 更改为zl==0,然后将您的最后一行设为return counter(z[1:], c+1)。带冒号的方括号是切片运算符; "abc"[1:]=="bc".

...顺便说一句,技术上你甚至不需要得到zlen(),因为python 在 if 表达式中将空列表视为虚假。所以你的代码可能只是:

def counter(z, c=0):
    if not z: return c
    return counter(z[1:], c+1)

【讨论】:

  • 你能告诉我如何做同样的事情,但要一个数字吗?
【解决方案2】:

一种可能的解决方案:传递一个字符串并且不传递计数器值,而不是在递归调用中对没有一个字符的字符串进行切片,并在字符串为空时终止:

def counter(s, c=0):
    if not s:
        return c
    else:
        return counter(s[:-1], c+1)

c = counter("abc")

【讨论】:

    【解决方案3】:

    你只需要对字符串进行切片。例如使用z[:-1]。这将返回所有字符减去最后一个字符。或者,您可以使用len(z) 计算它们。同样设置z=len(z) 也不起作用,因为您松开了字符串。

    【讨论】:

      【解决方案4】:

      您只需在第一次调用函数时传递 z 的长度。

      def counter(z, c = 0):
      if z == 0:
          return c
      else:
          return counter(z - 1,c + 1)
      
      # Main call
      z = len(z)
      result = counter(z)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-07
        • 2019-09-06
        相关资源
        最近更新 更多