zoukankan      html  css  js  c++  java
  • 约瑟夫环:递归算法

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt355

    假设下标从0开始,0,1,2 .. m-1共m个人,从1开始报数,报到k则此人从环出退出,问最后剩下的一个人的编号是多少?

    现在假设m=10

    0 1 2 3  4 5 6 7 8 9    k=3

    第一个人出列后的序列为:

    0 1 3 4 5 6 7 8 9

    即:

    3 4 5 6 7 8 9 0 1(*)

    我们把该式转化为:

    0 1 2 3 4 5 6 7 8 (**)

    则你会发现: ((**)+3)%10则转化为(*)式了

    也就是说,我们求出9个人中第9次出环的编号,最后进行上面的转换就能得到10个人第10次出环的编号了 

    设f(m,k,i)为m个人的环,报数为k,第i个人出环的编号,则f(10,3,10)是我们要的结果

    当i=1时,  f(m,k,i) = (m+k-1)%m

    当i!=1时,  f(m,k,i)= ( f(m-1,k,i-1)+k )%m

    所以程序如下:

    int fun(int m,int k,int i){
     
        if(i==1)
            return (m+k-1)%m;
        else
            return (fun(m-1,k,i-1)+k)%m;
     
    }
    int main(int argc, char* argv[])
    {
         
        for(int i=1;i<=10;i++)
            printf("第%2d次出环:%2d ",i,fun(10,3,i));
        return 0;
    }
    第 1次出环: 2
    第 2次出环: 5
    第 3次出环: 8
    第 4次出环: 1
    第 5次出环: 6
    第 6次出环: 0
    第 7次出环: 7
    第 8次出环: 4
    第 9次出环: 9
    第10次出环: 3
  • 相关阅读:
    java.lang.NoSuchMethodError:antlr.collections.AST.getLine() I
    T7 java Web day01 标签HTML
    T6 s1 day19
    T5 s5 Day18
    T5 s4 Day 17
    T5 s3 day16
    T5 s2 Day 15
    T5 s1 day14
    T4 S03 day 12
    T4 S01 day1
  • 原文地址:https://www.cnblogs.com/grefr/p/6088432.html
Copyright © 2011-2022 走看看