coro學習 擊鼓傳花

2021-06-07 21:23:22 字數 1465 閱讀 7622

這個是協程的經典例子。

之前有一篇erlang和stackless比較的文章有詳細介紹。

用perl的coro實現了一下。

程式沒有很好地優化架構,不過便於閱讀。

#!/usr/bin/env perl

#coro測試程式testcoro11.pl

#perl版的擊鼓傳花(erlang和stackless的經典例子)

#由n個節點組成乙個環狀網路,在上面傳送共m個訊息。

#將每個訊息(共m個),逐個傳送給1號節點。

#第1到n-1號節點在接收到訊息後,都**給下一號節點。

#第n號節點每次收到訊息後,不再繼續**。

#當m個訊息都從1號逐個到達第n號節點時,認為全部處理結束。

#每次執行時設定n=300,m=10000

use strict;

use coro;

my $n=$argv[0];

if(not defined $n);

my $m=$argv[1];

if(not defined $m)

#建立channel

my @ch;

foreach my $i (1..$n)

#用於結束

my $result=new coro::channel;

#建立節點(協程)

my @coro;

foreach my $i (1..$n) = $i; #給協程起個名字

while ()

}else

#if($msg >= $m)

} }}

#初始化訊息

foreach my $j (1..$m)

#等待結束訊息

my $msg=$result->get;

&debug("received final msg $msg.\n",1);

sub debug($$)

if($dlvl >= $debuglvl )

return 0;

}

實際測試結果,在注釋掉debug函式呼叫的情況下,相比erlang和stackless還是有不小的差距的。
#-bash-3.00$ time ./tcoro12_ring.pl 30000 100

#received final msg 100.

##real    0m31.085s

#user    0m30.965s

#sys     0m0.118s

#-bash-3.00$ time ./tcoro12_ring.pl 100 30000

#received final msg 30000.

##real    0m29.439s

#user    0m29.418s

#sys     0m0.019s

#-bash-3.00$

擊鼓傳花 Python

有多少種不同的方法可以使得從小賽手裡開始傳的花,傳了m次以後,又回到小賽手裡。對於傳遞的方法當且僅當這兩種方法中,接到花的同學按接球順序組成的序列是不同的,才視作兩種傳花的方法不同。比如有3個同學1號 2號 3號,並假設小賽為1號,花傳了3次回到小賽手裡的方式有1 2 3 1和1 3 2 1,共2種...

題目 《擊鼓傳花》

description 設有n個人圍成乙個圈,每人手裡都握著乙個令牌寫明乙個數字 隨機生成的 從第乙個人開始玩 擊鼓傳花 遊戲,第乙個擊的次數為其令牌上寫明的數字數 假設為m1 第m1個人出列。下次再從第m1 1個人開始新的 擊鼓傳花 擊的次數也為其令牌上寫明的次數,等於該次數的人出列。重複以上過程...

動態規劃 擊鼓傳花

擊鼓傳花 題目描述 學校聯歡晚會的時候,為了使每乙個同學都能參與進來,主持人常常會帶著同學們玩擊鼓傳花的遊戲。遊戲規則是這樣的 n個同學坐著圍成乙個圓圈,指定乙個同學手裡拿著一束花,主持人在旁邊背對著大家開始擊鼓,鼓聲開始之後拿著花的同學開始傳花,每個同學都可以把花傳給自己左右的兩個同學中的乙個 左...