利用JavaScript解决约瑟夫环的问题

问题背景:我们先来了解一下什么是约瑟夫环问题: 讲一个比较有意思的故事:约瑟夫是犹太军队的一个将军,在反抗罗马的起义中,他所率领的军队被击溃,只剩下残余的部队40余人,他们都是宁死不屈的人,所以不愿投降做叛徒。一群人表决说要死,所以用一种策略来先后kill所有人。 于是约瑟夫建议:每次由其他两人一起kill一个人,而被kill的人的先后顺序是由抽签决定的,约瑟夫有预谋地抽到了最后一签,在kill了除了他和剩余那个人之外的最后一人,他劝服了另外一个没死的人投降了罗马。

这里我们以十个人为例子

<script>

        let out=0//被kill的人数

        let index=0//所循环的次数

        let kill=0//所计数

        let n=10

        let arr = new Array(n)

        for(let i=0;i<n;i++)

{

        arr[i]=i+1

}

        while(kill<n-1)

{

if(arr[index%arr.length]!=0)

count++

if(count==3)

        {

                out++

                count=0

                arr[index%arr.length]=0

        }

index++

}

    for (let i=0;i<arr.length;i++)

        {

            if(arr[i]!=0)

            {

               console.log("存活的是"+arr[i])              

            }

        }

</script>

十个人的话,最后剩余的是4

另:

        let n=10

        let arr = new Array(n)

        for(let i=0;i<n;i++)

{

        arr[i]=i+1

}

   let index=0

            while(arr.length>1)

             {

               index = (index+2)%arr.length

               console.log(`本次被kill的是${arr[index % arr.length]}`)

               arr.splice(index,1)

            }

用JavaScript特有的splice, splice会改变原数组结构,通过这个特性就可以找到此时的index到下一个index之间刚好是2

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值