【问题标题】:Finding adjacent pairs of characters in a string using recursion使用递归查找字符串中相邻的字符对
【发布时间】:2018-09-03 16:28:36
【问题描述】:

我要写一个程序,用递归函数来统计字符串中重复字符对的数量,而且字符对不能重叠。

比如说,我输入了字符串“Hello, Sabeena”。我需要输出为“2”,一个用于 ls 对,一个用于 es 对。

这是我试过的,但是没有输出。

message = input("Enter a message:\n")
pairs = 0
k = 0

if len(message) == k:
    return("Number of pairs:",pairs)
else:
    if message[k] == message[k+1]:
        pairs = pairs + 1
        k = k+1
    else:
        k = k+1

理想情况下,程序应如下所示:

Enter a message:
Hello, Sabeena
Number of pairs: 2

谁能建议我哪里出错了?

【问题讨论】:

  • 你至少应该有一个循环。
  • 这就是递归 - 不允许循环......
  • 那你至少应该有一个功能。
  • 我会试试的。谢谢!

标签: python python-3.x recursion


【解决方案1】:

将递归代码放入一个函数中(直到它真正被认为是递归的),如果你还没有达到你的基本情况(k == len(message) - 1),则返回对函数的递归调用,递增@987654323 @每次。

def find_adjacent(message, pairs, k):
  if k == len(message) - 1: #subtract one to avoid getting a string index out of range error
    return("Number of pairs:", pairs)
  else:
    return find_adjacent(message, pairs+1 if message[k]==message[k+1] else pairs, k+1)


if __name__ == "__main__":
  message = "message" # change to input("Enter a message:\n")
  pairs = 0
  k = 0
  m, p = find_adjacent(message, pairs, k)
  print m, p

以上印刷品

Number of pairs: 1

如果你喜欢它不那么紧凑并且更易读:

def find_adjacent(message, pairs, k):
  if k == len(message)-1:
    return("Number of pairs:", pairs)
  elif message[k] == message[k+1]:
    if k == 0:
      return find_adjacent(message, pairs+1, k+1) # first letter of message, all good
    elif message[k] != message[k-1]:
      return find_adjacent(message, pairs+1, k+1) # not first letter, and this pair hasn't been counted before
    else:
      return find_adjacent(message, pairs, k+1) # this sequence has already been counted
  else:
    return find_adjacent(message, pairs, k+1)

【讨论】:

  • 这太棒了!但是,如果您想从输出中删除括号和引号,您会怎么做?
  • @Lauren 我更新了答案以按照您想要的方式打印它。该函数返回一个元组 (docs.python.org/2/library/functions.html#tuple)。 m, p = find_adjacent(message, pairs, k 语法 unpacks 元组。顺便说一句,你所说的那些“反逗号”被称为单引号:)
  • 我遇到了一个小问题 - 当我输入“aaa”时,它说对数是 2,而当我想要得到的所需输出是 1...所以不知何故,在找到配对之后,它需要走到配对的末尾并重新开始......我该如何解决这个问题?
  • 抱歉,我不知道您希望更长的序列只计为一对。我已经更新了我的最后一点代码并添加了(希望是)解释性 cmets,如果有什么不清楚的地方,请大声说出来。
【解决方案2】:

这是一个递归函数,它传递一个新的消息副本,每次都更短。

这是大多数递归函数所做的:不节省内存,但以比基于循环的方法更简单的方式解决问题。当然,这里不是这种情况,但这只是一个练习。

def count_adj(message, adj, c):
    """Recursively counts the number of adjacent characters"""
    if len(message) < 1:
        return adj
    else:
        if c == message[0]:
            adj += 1
        return count_adj(message[1:], adj, message[0])


tests = ("Hello, Sabeeenaa", "Hi", "h", "HH", "HHH", "", " ", "  ")

for t in tests:
    print t, ":", count_adj(t, 0, '')

结果:

Hello, Sabeeenaa : 4
Hi : 0
h : 0
HH : 1
HHH : 2
 : 0
  : 0
   : 1

【讨论】:

    猜你喜欢
    • 2014-05-16
    • 2016-10-02
    • 2014-02-19
    • 2021-09-20
    • 2017-06-13
    • 2021-12-10
    • 2015-05-13
    • 2016-01-27
    • 2021-06-29
    相关资源
    最近更新 更多