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

来源:互联网 发布:touch.js api 编辑:程序博客网 时间:2024/05/24 00:03

什么是约瑟夫环:

约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知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;
0 0