我正在尝试构建一个递归程序,打印由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 = 3
和symbols = ['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"]]
这是怎么发生的,我逻辑中的错误在哪里?
答案 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”。