Solve Josephus Problem Using Erlang

本文介绍了一种通过递归和模运算解决约瑟夫问题的数学方法,详细解释了如何使用函数来实现这一过程,适用于不同人数的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Josephus(约瑟夫)问题的数学方法

%%%----------------------------------------------------------------
%%% @author Genesislive <genesislive@126.com>
%%% 	[https://]
%%% @copyright 2013 
%%% @doc josephus problem
%%% @end
%%%----------------------------------------------------------------
-module(josephus).
 
-export([josephus_it/2, josephus/2]).
 
%%-----------------------------------------------------------------
%% @doc solve josephus problem
%%		fun(1) = 0,	一个人;
%%		fun(n) = (fun(n - 1) + m) % n,  n个人
%% @spec josephus_it(N, M) -> integer()
%% where
%%  N:integer() number of people
%%  M:integer() mth people	
%% @end
%%-----------------------------------------------------------------
josephus_it(1, _) -> 0;
josephus_it(N, M) ->
	(josephus_it(N - 1, M) + M) rem N.
 
%%-----------------------------------------------------------------
%% @doc
%% @end
%%-----------------------------------------------------------------
josephus(N, M) ->
	lists:foldl(fun(I, S) ->
				   % io:format("~p~n", [((S + M) rem I)]),
				   ((S + M) rem I)
				end, 0, lists:seq(2, N)).


0/1 背包问题是一个经典的组合优化问题,可以使用动态规划或者回溯算法进行求解。下面给出使用回溯算法进行求解的伪代码,并尝试画出对应的决策树。 假设有 n 个物品,重量分别为 w[1], w[2], ..., w[n],价值分别为 v[1], v[2], ..., v[n]。现在有一个容量为 W 的背包,问如何选择物品放入背包中,使得背包中物品的总价值最大。 回溯算法: 1. 初始化一个全局变量 max_value,表示当前找到的最大价值。 2. 定义一个 backtracking 函数,用于搜索所有可能的解。 3. backtracking 函数的参数包括当前已经选择的物品下标 i,当前已经选择的物品总重量 weight,当前已经选择的物品总价值 value,以及剩余容量为 W - weight 的背包。 4. 如果背包已经装满,或者已经搜索完所有物品,则更新 max_value 的值为当前价值和 max_value 的较大值。 5. 否则,对于当前物品 i,有两种情况:选择放入背包,或者不放入背包。 6. 如果选择放入背包,更新 weight 和 value 的值,递归调用 backtracking 函数处理下一个物品。 7. 如果不放入背包,直接递归调用 backtracking 函数处理下一个物品。 8. 回溯时,恢复 weight 和 value 的值,回到上一层递归。 9. 返回 max_value,表示找到的最大价值。 决策树: 下面是一个 n=3、W=6 的例子,对应的决策树如下所示。其中,每个节点表示一个状态,包括已经选择的物品、当前总重量和总价值。箭头表示做出选择的方向,绿色的节点表示找到最优解。 ``` (0, 0, 0) / \ (1, 2, 3) (1, 0, 0) / \ / \ (2, 3, 4) (2, 2, 3) (2, 0, 0) (2, 2, 3) / \ / \ / \ / \ (3, 4, 5) (3, 3, 5) (3, 0, 0) (3, 3, 5) (3, 1, 2) | | | | | | * * * * * * ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值