递归程序永远不会进入递归?

时间:2018-03-13 13:44:43

标签: ruby recursion

我正在尝试构建一个递归程序,打印由length中的元素组成的所有大小为symbols的数组。我将结果推送到$pos

def h(seq, symbols, length)
  if seq.length == length
    $pos << seq
  elsif symbols.empty?
    nil
  else
    h(seq << symbols[0], symbols, length)
    h(seq, symbols[1..-1], length)
  end
end

我使用length = 3symbols = ['a', 'b', 'c']运行它,如下所示:

symbols = ['a', 'b', 'c']
length = 3
seq = []
h(seq, symbols, length)
$pos

输出结果为:

[["a", "a", "a"], ["a", "a", "a"], ["a", "a", "a"], ["a", "a", "a"]]

这是怎么发生的,我逻辑中的错误在哪里?

1 个答案:

答案 0 :(得分:0)

好吧,好吧,我会一起玩。

正如您可以查看my repl.it,我使用了您的代码,只添加了两个“放置”。我用与你相同的参数运行它。

              if(project._embedded['wp:featuredmedia']) {
                //...
                return str;
              }
            }
          })
      })
    })

  })
  .then((str) => {
    document.getElementById('projects-container').innerHTML = str;
  })

为了解释这导致我们需要查看代码的这一部分:

h([], ["a", "b", "c"], 3)
> first
> first
> first
> second
> second
> second
=> [["a", "a", "a"], ["a", "a", "a"], ["a", "a", "a"], ["a", "a", "a"]]

您总是在执行中致电else h(seq << symbols[0], symbols, length) h(seq, symbols[1..-1], length) end 。这总是在你的seq变量中加上“a”。一旦你的seq中有三个字符,你就会第一次追加它。由于脚本的if else结构,该级别函数的执行结束。

然后再次致电h << seq symbols[0]。这里的问题是,你已经有h(seq, symbols[1..-1], length),所以你只需要再次附加它并结束函数的执行。

然后,再次致电seq.length == 3,您就明白了。

所以,这就是你解释逻辑的错误。

我不会为你编写代码,但希望这可以解释故障的位置。

  

提示:您可以使用seq.dup作为这两个函数的参数,因为这将执行它在C中的操作。但是,由于h(seq, symbols[1..-1], length)消除,这也不会像您期望的那样工作来自排列的“a”。