Ruby中的递归字符串修改

时间:2016-06-08 17:26:30

标签: ruby string

我有一个字符串。我需要让其他所有行都反转。如果count为2,则应显示:

"Hola mi amigo \nogima im aloH"

如果count为3,则应显示:

"Hola mi amigo \nogima im aloH \nHola mi amigo"

等等。在每个其他"\n"之间执行字符串修改的最短方法是什么?

我的预感是使用正则表达式。除了正则表达式解决方案,还有任何非正则表达式解决方案吗?我想看到两者进行比较。

def hola(count) 
  if COUNT IS LESS THAN 2
    return false
  elsif ODD
    (("Hola mi amigo ")*((count-1)/2) + "\n") * count 
  elsif EVEN
    (("Hola mi amigo ")*(count/2) + "\n") * count 
  end 
end

5 个答案:

答案 0 :(得分:4)

如果实施中没有限制,那么尝试这样的事情:

string = "Hola mi amigo"
reversed_string = string.reverse
count.times.map { |i| i.odd? ? reversed_string : string }.join "\n"

times.map将创建一个枚举器。下一个块将检查当前索引是奇数还是偶数;在第一种情况下,它将反转字符串,并返回它。最后,所有字符串都与join(带换行符)连接在一起。

此外,这是另一个(也可能是效率较低的)递归解决方案:

def hola(count)
  if count == 0
    ''
  elsif count.even?
    "Hola mi amigo".reverse + "\n" + hola(count - 1)
  else
    "Hola mi amigo" + "\n" + hola(count - 1)
  end
end

答案 1 :(得分:4)

解决方案1 ​​

我很惊讶没有人提出Enumerable#cycle的解决方案(也许@CarySwoveland正在休假):

def hola(str, count) 
  [ str, str.reverse ].cycle.take(count).join("\n")
end

puts hola("Hola mi amigo", 1)
# => Hola mi amigo

puts hola("Hola mi amigo", 2)
# => Hola mi amigo
#    ogima im aloH

puts hola("Hola mi amigo", 3)
# => Hola mi amigo
#    ogima im aloH
#    Hola mi amigo

puts hola("Hola mi amigo", 8)
# => Hola mi amigo
#    ogima im aloH
#    Hola mi amigo
#    ogima im aloH
#    Hola mi amigo
#    ogima im aloH
#    Hola mi amigo
#    ogima im aloH

解决方案2

我想到OP可能正在寻找递归解决方案,正如他们在标题中所写:

def hola(str, count)
  return "" if count <= 0
  str + "\n" + hola(str.reverse, count - 1).chomp
end

输出与上述相同。显然它不那么有效,但我更喜欢它。

答案 2 :(得分:1)

出于好奇:

str = '¡Hola mi amigo!'
([str, str.reverse] * (count / 2 + 1)).take(count).join $/
([str] * count).map.with_index { |s, i| i.even? ? s : s.reverse }.join $/
([str] * count).each.with_index.with_object("") do |(s, i), acc|
  acc << (i.even? ? s : s.reverse) << $/
end.strip

为了使其更加健壮(Cary的信用),可以提前准备反向字符串。

答案 3 :(得分:1)

def alternate(str, count)
  (("%s\n%s\n" % [str, str.reverse])*(count/2) << str*(count % 2)).chomp
end

str = "Hola mi amigo"

puts alternate(str, 4)  
Hola mi amigo
ogima im aloH
Hola mi amigo
ogima im aloH

puts alternate(str, 5)  
Hola mi amigo
ogima im aloH
Hola mi amigo
ogima im aloH
Hola mi amigo

答案 4 :(得分:0)

我对Ruby没有特别的经验,但是从一些轻微的搜索中,我会在你的elsif语句中使用.reverse方法和for循环。它不应该太难拼凑起来。

可以在这里找到一些.reverse文档:

http://www.informit.com/articles/article.aspx?p=2314083&seqNum=29