用pl/sql游标实现约瑟夫环

什么是约瑟夫环:

约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为1的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后结果+1即为原问题的解。

创建一个全局临时表:

create global temporary table temp(t_id int) on commit delete rows;

游标实现约瑟夫环:

declare
  --总人数
  v_total number:=&v_total;
  --对应的m
  v_step number:=&v_step;
  --剩余的人数
  v_surplus number;
  --计数
  v_count number:=0;
begin
  --将数据插入到表中
  for i in 1..v_total loop
    insert into temp values(i);
  end loop;
  v_surplus:=v_total;
  while v_surplus>1 loop
    --声明一个游标
    declare
      cursor c_temp
      is
      select * from temp;
      c_row c_temp%rowtype;
    begin
      open c_temp;  
      loop
        fetch c_temp into c_row;
        exit when c_temp%notfound;
        v_count:=v_count+1;
        --判断是否报到m的倍数,是则从表中删除
        if mod(v_count,v_step)=0 then
          dbms_output.put_line(c_row.t_id);
          delete from temp where t_id=c_row.t_id;
        end if;
      end loop;
      close c_temp;
    end;
    --重新计数剩余的人数
    select count(*) into v_surplus from temp;
  end loop;
  commit;
end;
    原文作者:渣渣潘
    原文地址: https://www.cnblogs.com/zhazhapan/p/sql_joseph.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞