首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby中的递归字符串修改

Ruby中的递归字符串修改
EN

Stack Overflow用户
提问于 2016-06-08 17:26:29
回答 5查看 216关注 0票数 0

我有一根绳子。我要把其他的台词都颠倒过来。如果计数为2,则应显示:

代码语言:javascript
复制
"Hola mi amigo \nogima im aloH"

如果计数为3,则应显示:

代码语言:javascript
复制
"Hola mi amigo \nogima im aloH \nHola mi amigo"

诸若此类。在其他每个"\n"之间执行字符串修改的最短方式是什么?

我的预感是用正则表达式。除了regex解,还有什么非正则解吗?我想看看两者的比较。

代码语言:javascript
复制
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
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-06-08 17:32:48

如果在实现中没有任何限制,那么尝试如下所示:

代码语言:javascript
复制
string = "Hola mi amigo"
reversed_string = string.reverse
count.times.map { |i| i.odd? ? reversed_string : string }.join "\n"

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

此外,这里还有另一种(而且可能效率较低)递归解决方案:

代码语言:javascript
复制
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
票数 4
EN

Stack Overflow用户

发布于 2016-06-08 18:43:28

解决方案1

我感到惊讶的是,没有其他人提出与Enumerable#cycle的解决方案(也许@CarySwoveland正在度假):

代码语言:javascript
复制
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实际上是在寻找一种递归解决方案,正如他们在标题中所写的:

代码语言:javascript
复制
def hola(str, count)
  return "" if count <= 0
  str + "\n" + hola(str.reverse, count - 1).chomp
end

输出与上述相同。很明显,它不那么有效,但除此之外,我更喜欢它。

票数 4
EN

Stack Overflow用户

发布于 2016-06-08 17:59:01

只是出于好奇:

代码语言:javascript
复制
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的学分),可以提前准备反向字符串。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37709094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档