0

我想写一行递归缩进的代码。我只是在研究一种使用全局选项卡变量的方法。所以我使用了以下代码:

@@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>

但是为什么结束的再见标签也没有缩进呢?我将它保存为“帮助”函数中的“正确”局部变量。谢谢您的帮助!

4

2 回答 2

1

您的 helper2 方法输出一个字符串,其中包含:

@@nl + '</goodbye>'

换行符和结束标记之间不可能有任何缩进

于 2013-01-28T01:12:30.980 回答
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)

执行(红宝石 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
于 2013-01-28T10:16:34.107 回答