编写一个函数(founction),只要在参数列表里随便填上几个数(可以把这些数放在数组里做参数),这个函数就能输出所有可能不重复的排列。像这样的:a=1,b=2,c=3;
最后输出的结果是
123
132
213
231
312
321
其中它们三个数不能重复。

解决方案 »

  1.   

    var a = "1,4,5";
    var arr = a.split(",");
    var ln = arr.length;
    var rt=[];arr.sort(function(a,b){return a-b;});
    for(var i=0;i<ln;i++){
       for(var j=0;j<ln;j++){
             if(i==j) continue;
             else{
               for(var k=0;k<ln;k++){
                  if(i==k||j==k) continue;
                  else{
                       rt.push(""+arr[i]+arr[j]+arr[k]);
                  }
               }
            } 
       }
    }
    alert(rt)
      

  2.   

    <script>
    //组合
    function C(arr, num){
    var r=[];
    (function f(t,a,n){
    if (n==0) return r.push(t);
    for (var i=0,l=a.length; i<=l-n; i++){
    f(t.concat(a[i]), a.slice(i+1), n-1);
    }
    })([],arr,num);
    return r;
    }//排列
    function P(arr, num){
    var r=[];
    (function f(t,a,n){
    if (n==0) return r.push(t);
    for (var i=0,l=a.length; i<l; i++){
    f(t.concat(a[i]), a.slice(0,i).concat(a.slice(i+1)), n-1);
    }
    })([],arr,num);
    return r;
    }var r1 = C("0123456789".split(""),3);
    document.write('组合:<ol><li>'+r1.join('</li><li>')+'</li></ol><br /><br />');
    var r2 = P("0123456789".split(""),3);
    document.write('排列:<ol><li>'+r2.join('</li><li>')+'</li></ol>');
    </script>
      

  3.   


    var nums=[1,2,3];
    var results=new Array();
    /**
    *@param nums 数组.
    *@param indexs 目前构成的数字使用了哪些下标。
    *@param str 组合而成的字符串。
    */
    function toDo(nums,indexs,str)
    {
    for(var i=0;i<nums.length;i++)
    {
    if(indexs.indexOf(i)==-1)
    {
    var str2=str+nums[i];/*这里必须重新申请两人个变量,不然会把之前的str的指针带入下一次循环,结果不准确*/
    var indexs2=indexs+i; if(str2.length==nums.length)
    {
    results[results.length]=str2;
    }
    else
    {
    toDo(nums,indexs2,str2);
    }
    }
    }
    }(function(){toDo(nums,"","");/* 初始时结果字符串为空,使用的下标的集合也为空。 */
    alert(results);
    })();/*执行计算*/
      

  4.   

    <%
    '============================================================================
    ' 功能:根据输入以半角逗号分隔的数字字符串生成有其中所包含数字的不重复的排列组合代码
    ' 参数:str 为数字用半角逗号分隔
    '============================================================================
    sub sub1(str)
    arr = split(str, ",")
    uboundArr = ubound(arr)
    '如果str为一个数字则直接输出它
    if uboundArr = 0 then
    response.Write(str)
    exit sub
    end if

    ' for i = 0 to ubound(arr)
    ' for j = 0 to ubound(arr)
    ' for k = 0 to ubound(arr)
    ' if arr(i) <> arr(j) and arr(j) <> arr(k) and arr(i) <>arr(k) then
    ' response.Write(arr(i) & arr(j) & arr(k) & "<br />")
    ' end if
    ' next
    ' next
    ' next

    '以下代码为动态生成上面注释类似代码]
    '变量说明:
    '  asp_str 用来存放这个动态生成的代码
    '  asp_if 用来存放循环最深处的if代码
    '  asp_response 用来存放 asp_if 里的response.write(...)里的arr(i) & arr(j) ...代码

    asp_str = "for i0 = 0 to uboundArr" & vbcrlf & "{0}" & vbcrlf & "next" & vbcrlf
    asp_if = ""

    for i = 1 to uboundArr
    asp_str = replace(asp_str, "{0}", "for i" & i & " = 0 to uboundArr" & vbcrlf & "{0}" & vbcrlf & "next" & vbcrlf)
    for j = 0 to uboundArr - 1
    asp_if = asp_if & " arr(i" & i & ") <> arr(i" & j & ") and"
    next
    next

    asp_response = "arr(i0)"
    for i = 1 to uboundArr - 1
    asp_if = replace(asp_if, " arr(i" & i & ") <> arr(i" & i & ") and", "")
    asp_response = asp_response & "&" & "arr(i" & i & ")"
    next
    asp_response = asp_response & "&arr(i" & uboundArr & ")"
    asp_if = left(asp_if, len(asp_if) - 4)
    asp_if = "if" & asp_if & " then" & vbcrlf
    asp_if = asp_if & "response.Write(" & asp_response & "&""<br />"")" & vbcrlf
    asp_if = asp_if & "end if" & vbcrlf
    asp_str = replace(asp_str, "{0}", asp_if)

    execute(asp_str)
    end subsub1 "1,2,3"
    %>