<div dir="auto">Hi Folks,<div dir="auto"><br></div><div dir="auto">Wowwwwww... thank you very much for your attention guys. </div><div dir="auto"><br></div><div dir="auto">Thank you very much for all of your answers, then now is my turn to make practice based on all of the answers. </div><div dir="auto"><br></div><div dir="auto">Thank you all. I hope i can grok how this code works </div><div dir="auto"><br></div><div dir="auto"><br></div><div dir="auto"><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Pada tanggal Jum, 23 Agt 2019 20.47, Jesper Louis Andersen <<a href="mailto:jesper.louis.andersen@gmail.com">jesper.louis.andersen@gmail.com</a>> menulis:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div dir="ltr"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><span style="font-family:Arial,Helvetica,sans-serif">On Fri, Aug 23, 2019 at 2:03 PM I Gusti Ngurah Oka Prinarjaya <<a href="mailto:okaprinarjaya@gmail.com" target="_blank" rel="noreferrer">okaprinarjaya@gmail.com</a>> wrote:</span><br></div></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Hi,<div><br></div><div>Now I read Joe's book titled Programming Erlang 2nd Edition. I practice some functions such as for/3, quicksort/1, pythag/1, and perms/1, and perms/1 is the function that hard to understand.</div><div><br></div><div>I understand comprehension lists, I fully understand for/3, I fully understand quicksort/1, pythag/1. But it's really hard for me to understand <font face="monospace">perms/1</font>. Please teach me how to read and understand this <font face="monospace">perms/1</font> function.</div><div><br></div><div><font face="monospace">perms([]) -> [[]];<br>perms(List) -> [ [H|T] || H <- List, T <- perms(List--[H]) ].</font><br></div><div><br></div></div></blockquote><div><br></div><div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">Note you have two generators in the comprehension. So for each generated H, it generates all the possible T's. Also note that the T's depend on the H. It is akin to having a for-loop within a for-loop:</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">for H := range(List) {</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">  for T := perms(List -- [H]) {</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">     Res := append(Res, [H|T])</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">  }</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">}</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">Now, to understand why this works, the argument is based on an induction principle:</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">Observe that to generate a permutation, you first select something which goes first, H, and then you need to generate a permutation out of the remaining elements, List -- [H]. Suppose we fix H to some value in the list. Then surely, we can generate all the permutations where H goes first, by generating perms(List - [H]) and then attaching H to all the results:</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">perms(List) -></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">  H = pick_among(List),</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">  [ [H|T] || T <- perms(List -- [H]) ].</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">But now note that to generate all permutations, any element could have been picked by pick_among/1. So we need to loop over all elements in the list one at a time, and consider what happens if that element goes first. This is what the original code is doing.</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">Alternative wordings by Sverker and Fred :)</div><br></div></div></div>
</blockquote></div>