当前位置:首页 > PHP

约瑟夫环php实现

2026-02-16 01:50:22PHP

约瑟夫环问题简介

约瑟夫环是一个经典的数学问题:n个人围成一圈,从某个指定的人开始报数,数到k的人出列,接着从下一个人重新开始报数,直到所有人出列。需确定出列顺序或最后幸存者的位置。

PHP实现方法

方法1:数组模拟

通过循环数组模拟报数过程,逐个移除元素:

function josephusArray($n, $k) {
    $people = range(1, $n);
    $result = [];
    $index = 0;

    while (!empty($people)) {
        $index = ($index + $k - 1) % count($people);
        $result[] = $people[$index];
        array_splice($people, $index, 1);
    }
    return $result;
}
// 示例:5个人,数到3出列
print_r(josephusArray(5, 3));

方法2:数学递归

利用递归公式计算幸存者位置(仅返回最后幸存者):

function josephusMath($n, $k) {
    if ($n == 1) {
        return 1;
    } else {
        return (josephusMath($n - 1, $k) + $k - 1) % $n + 1;
    }
}
// 示例:5个人中最后幸存者的初始位置
echo josephusMath(5, 3); // 输出4

方法3:迭代优化

将递归转为迭代以提高效率:

约瑟夫环php实现

function josephusIterative($n, $k) {
    $result = 0;
    for ($i = 2; $i <= $n; $i++) {
        $result = ($result + $k) % $i;
    }
    return $result + 1;
}
// 示例:41个人,数到3时最后幸存者
echo josephusIterative(41, 3); // 输出31

注意事项

  • 数组模拟法直观但时间复杂度为O(n²),适合小规模数据。
  • 数学方法效率为O(n),适合大规模计算,但仅返回最后幸存者。
  • 参数$n$k需为正整数,否则需添加校验逻辑。

可根据实际需求选择实现方式。

标签: 约瑟夫php
分享给朋友:

相关文章

php实现推送消息推送消息

php实现推送消息推送消息

PHP 实现消息推送的方法 使用 WebSocket 实现实时推送 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,适合实现实时消息推送。 安装 Ratchet 库(WebSo…

php实现多态

php实现多态

多态的概念 多态是面向对象编程的三大特性之一,指同一个方法在不同类中有不同实现方式。PHP通过继承和接口实现多态。 通过继承实现多态 父类定义方法,子类重写该方法实现不同行为: class…

排序算法 php实现

排序算法 php实现

以下是用PHP实现的常见排序算法,每种算法均附示例代码和简要说明: 冒泡排序 通过重复比较相邻元素并交换位置实现排序: function bubbleSort($arr) { $n = c…

php下载文件实现

php下载文件实现

PHP 下载文件实现方法 使用 header() 函数强制下载 设置合适的 HTTP 头信息,强制浏览器下载文件而非直接打开。 $file_path = '/path/to/file.pdf'; $…

php多态实现

php多态实现

PHP 多态的实现方法 多态是面向对象编程的三大特性之一,允许不同类的对象对同一消息做出响应。PHP 主要通过以下方式实现多态: 通过继承和方法重写 子类继承父类并重写父类方法,实现不同子类对同一方…

php 实现下载apk

php 实现下载apk

使用 PHP 实现 APK 文件下载 通过 PHP 实现 APK 文件下载的核心是设置正确的 HTTP 头信息,并输出文件内容。以下是一个完整的实现方法。 设置 HTTP 头信息 确保客户端正确识别…