我想编写一行递归缩进的代码。我只是在研究一种使用全局制表变量的方法。所以我使用了以下代码:
@@tab = ' '
@@tab_add = ' '
@@nl = "\n"
def helper
left = @@tab
right = @@tab
@@tab = @@tab + @@tab_add
str = '<hello>' + @@nl + left + helper2 + right + @@nl + '</hello>'
end
def helper2
left = @@tab
right = @@tab
@@tab = @@tab + @@tab_add
str = '<goodbye>' + @@nl + left + helper3 + right + @@nl + '</goodbye>'
end
def helper3
str = 'dawg'
end
我知道,这不是最优雅的方式,但我只是在尝试。无论如何,当我输入
helper
我得到了
<hello>
<goodbye>
dawg
</goodbye>
</hello>
但为什么闭合的再见标签也不缩进?我将它保存为“帮助”功能中的“正确”局部变量。谢谢你的帮助!
答案 0 :(得分:1)
您的helper2方法输出一个包含以下内容的字符串:
@@nl + '</goodbye>'
新行令牌和结束标记
之间不能有任何缩进答案 1 :(得分:0)
你需要一个递归方法。
@@tab = ' '
@@nl = "\n"
indent = 0
def helper3
str = 'dawg'
end
def indented(p_indent, p_string='')
@@tab * p_indent + p_string
end
def write_indented(p_indent, p_array)
return indented(p_indent, helper3) if p_array.empty?
head, *tail = p_array
indent = indented(p_indent)
indent + '<' + head + '>' + @@nl +
# recursive call :
write_indented(p_indent + 1, tail) +
@@nl + indent + '</' + head + '>'
end
tags = %w[hello goodbye]
puts write_indented(indent, tags)
执行(ruby 1.8.6):
$ ruby -w t.rb
<hello>
<goodbye>
dawg
</goodbye>
</hello>
不幸的是,大多数时候通过阶乘或斐波纳契函数解释递归,这使得理解起来更加困难。
如果你通过一连串的调用表示递归,那实际上很简单:
write_indented(0, ['hello', 'goodbye'])
...
call write_indented(1, ['goodbye'])
|
|
+--> ...
call write_indented(2, [])
|
|
+--> return if stop condition
|
+<-------+
+<------+ return
|
<----+ returned value
end