Difference between revisions of "User:Dora Gustafson/occurences"

From Second Life Wiki
Jump to: navigation, search
(Count occurencces in a list)
 
(Count Occurrences in a list)
Line 27: Line 27:
 
}
 
}
 
</lsl>
 
</lsl>
 +
This program is straight, a recursive approach follows
 +
<lsl>
 +
// count occurrences in list; by Dora Gustafson, Studio Dora 2014
 +
// v1.1 inline code
 +
// v1.2 recursive approach
 +
 +
list haystack = [1,2,1,2,1,2,3,2,4,5,2,6,4,2,3,2,1,8];
 +
list needle = [2];
 +
integer j = 0;
 +
 +
tin( list L )
 +
{
 +
    integer k = llListFindList( L, needle);
 +
    if ( k >= 0 )
 +
    {
 +
        ++j;
 +
        if ( k+1 < llGetListLength(L) ) tin( llList2List( L, k+1, -1));
 +
    }
 +
}
 +
 +
default
 +
{
 +
    state_entry()
 +
    {
 +
        tin( haystack);
 +
        llOwnerSay((string)needle+" occurs "+(string)j+" times in "+llDumpList2String( haystack, ", "));
 +
    }
 +
}</lsl>
 +
The advantage of recursion over straight code is a shorter code(the code is reused)<br>
 +
The disadvantages are longer execution time and more overhead generated at runtime
 +
: For these reasons the recursion approach is a bad choice to search a long list in LSL
 
{{LSLC|Library}}
 
{{LSLC|Library}}

Revision as of 02:19, 2 April 2014

Count Occurrences in a list

Look for and count anything, that can be an element, in a list

This script is an example which include a list: "haystack" and an element: "needle"
Here "haystack" and "needle" are constants and only meant to make up a working script

<lsl> // count occurrences in list; by Dora Gustafson, Studio Dora 2014 // v1.1 inline code

default {

   state_entry()
   {
       list haystack = [1,2,1,2,1,2,3,2,4,5,2,6,4,2,3,2,1,8];
       list needle = [2];
       integer i = 0;
       integer j = 0;
       integer k = llListFindList( haystack, needle);
       integer m = llGetListLength( haystack );
       while ( k >= 0 && i < m )
       {
           i += k+1;
           k = llListFindList( llList2List( haystack, i, -1), needle);
           ++j;
       }
       llOwnerSay((string)needle+" occurs "+(string)j+" times in "+llDumpList2String( haystack, ", "));
   }

} </lsl> This program is straight, a recursive approach follows <lsl> // count occurrences in list; by Dora Gustafson, Studio Dora 2014 // v1.1 inline code // v1.2 recursive approach

list haystack = [1,2,1,2,1,2,3,2,4,5,2,6,4,2,3,2,1,8]; list needle = [2]; integer j = 0;

tin( list L ) {

   integer k = llListFindList( L, needle);
   if ( k >= 0 )
   {
       ++j;
       if ( k+1 < llGetListLength(L) ) tin( llList2List( L, k+1, -1));
   }

}

default {

   state_entry()
   {
       tin( haystack);
       llOwnerSay((string)needle+" occurs "+(string)j+" times in "+llDumpList2String( haystack, ", "));
   }

}</lsl> The advantage of recursion over straight code is a shorter code(the code is reused)
The disadvantages are longer execution time and more overhead generated at runtime

For these reasons the recursion approach is a bad choice to search a long list in LSL