1. 程式人生 > >遞迴求解約瑟夫環問題

遞迴求解約瑟夫環問題

01 2345

34 012

01 23

12 0

10

0

假設每一輪報到3的人死亡,然後從死亡的人後一位開始重新編號,以此類推,會形成上面的表格,最後留下的人的編號在開始的時候可以看到是0;那麼要如何求出最後留下的人的編號呢?

(求同一個人在不同輪數中的編號)

首先,從最後第二輪開始,最後留下的人的編號等於他在上一輪的編號 加上死亡間隔(也就是3,隔3個死一個嘛)再模上上一輪的總人數,寫成表示式就是(1 + 3) % 2, (1 + 3) % 3, (1 + 3) % 4, (0 + 3) % 5, (3 + 3) % 6,這樣求出來最後一個人的初始編號為零,然後加一,那麼最後留下的人就是第一個人。

上一輪的總人數設為

n, 死亡間隔設為m,那麼可以得到表示式:(x + m) % n

x為上一輪的編號,用遞迴可以表示為:

int JudgmentDeath(int n, int m, int i)
{
	if (i == 1)
	{
		return (m - 1) % n;
	}
	else
	{
		return (JudgmentDeath(n - 1, m, i - 1) + m) % n;
	}
}