随记(4)算法

一、查找最大值

在这里插入图片描述

二、翻转列表

在这里插入图片描述

三、插入排序

%%-----------------------------------------------------------------------------------------------
%% @doc 
%% 插入排序,从小到大,sort函数实现一遍插入排序。O(N2)
%% @end
%%-----------------------------------------------------------------------------------------------
	insert_sort(OldList) -> 
		insert_sort([],OldList).
	insert_sort(NewList,[H|T]) ->
		Result = sort(H, NewList), %% 把每个元素按序插入到新列表中,返回新列表
	    insert_sort(Result,T);
	insert_sort(NewList,[]) -> 
		NewList.
	
	%% 一个元素插入当前新列表
	sort(Num, []) -> 
		[Num]; %% 终止条件:当新列表循环到最后一个元素,从最后一个元素开始返回,然后++,直到列表第一个元素
	sort(Num, [H|T]) ->
	    if Num > H ->
	            [H] ++ sort(Num,T);
	        true ->
	            [Num] ++ [H|T]
	end.

在这里插入图片描述

四、冒泡排序

%%-----------------------------------------------------------------------------------------------
%% @doc 
%% 依次比较相邻的两个数,将小数放在前面,大数放在后面O(N2)
%% @end
%%-----------------------------------------------------------------------------------------------
	bubble_sort(OldList) -> 
		bubble_sort(OldList, length(OldList)-1).  
	
	
	bubble_sort(NewList,0) -> 
		NewList;
	bubble_sort([H|T], N) ->   
	    Result = bubble_once(H,T),  
	    bubble_sort(Result,N-1).
	
	bubble_once(Num,[]) -> [Num];
	bubble_once(Num, [H|T]) ->  
	    if 
	    	Num > H ->  
	            [H] ++ bubble_once(Num,T);  
	        true ->  
	            [Num] ++ bubble_once(H,T)
	    end.

五、快排

nlogn
在这里插入图片描述
思想:分治、递归,把问题细分成小的问题,然后递归实现
在这里插入图片描述

六、反转输出字符串,并移除其中的空格

在这里插入图片描述
在这里插入图片描述

七、快速判断一个数是否是素数的方法

在这里插入图片描述

八、道具升级演算,只扣满级前所需道具

calculate_wardrobe_lv(WardrobeLv, WardrobeExp, WardrobeId, Conf, [{GoodsTypeId, Num} | T], CostGoodsList) ->
	if
		Num =< 0 ->
			calculate_wardrobe_lv(WardrobeLv, WardrobeExp, WardrobeId, Conf, T, CostGoodsList);
		true ->
			HightestLv = lists:max(data_tupo:get_domain_wardrobe_lv_list()),
			{_, GoodsAddExp} = lists:keyfind(GoodsTypeId, 1, Conf),
			#record_domain_wardrobe{exp = UpgradeNeedExp} = data_tupo:get_domain_wardrobe_info(WardrobeId, WardrboeLv),
			if
				WardrobeLv >= HightestLv ->
					{WardrobeLv, 0, CostGoodsList, [{GooodsTypeId, Num} | T]};
				true ->
					NewWardrboeLv = ?IF(GoodsAddExp + WardrobeExp >= UpgradeNeedExp, WardrobeLv + 1, WardrobeLv),
					NewWardrobeExp = ?IF(GoodsAddExp + WardrobeExp >= UpgradeNeedExp, GoodsAddExp + WardrobeExp  - UpgradeNeedExp, GoodsAddExp + WardrobeExp)
			end;

calculate_wardrobe_lv(WardrobeLv, WardrobeExp, _WardrobeId, _Conf, [], CostGoodsList) ->
	{WardrobeLv, WardrobeExp, CostGoodsList, [}.

九、经验等级演算

	calculate_domain_lv (AddTotalExp, DomainLv, DomainExp, DomainId) ->
		MaxDomainLv = lists:max(data_tupo:get_domain_lv_info(DomianId)),
		if
			DomainLv >= MaxDomainLV ->
				{MaxDomainLv, 0};
			true ->
				#record_doamin_info{exp = UpNeedExp} = data_tupo:get_domain_info(DomainId, DomainLv),
				if
					AddTotalExp + DomainExp >= UpNeedExp ->
						calculate_domain_lv(AddTotalExp + DomainExp -UpNeedExp, DomainLv + 1, 0, DomainId);
					true ->
						{DomainId, AddTotalExp + DomainExp}
				end
		end.
		

十、经验等级演算

%% 兑换演算,返回ExGoodsList,NewScore, NewExList
exchange_goods ([], ExGoodsList, NewExList, NewScore) ->
{ExGoodsList, NewExList, NewScore};
exchange_goods ([H|T], ExGoodsList, NewExList, NewScore) ->
{Index, GoodsId, GoodsNum, NeedScore, LimitNum} = H,
CurExchangeTimes = proplists:get_value(Index, NewExList, 0),
if
%%-----兑换次数是否已达上限
CurExchangeTimes >= LimitNum ->
exchange_goods(T, ExGoodsList, NewExList, NewScore);
%%-----可兑换次数不可超过限制次数
true ->
%%
CanExTimes = NewScore div NeedScore,
CanExTimes1 = ?IF_ELSE(CanExTimes + CurExchangeTimes >= LimitNum, LimitNum, CanExTimes),
ExGoodsList1 = ?IF_ELSE(CanExTimes1 == 0, ExGoodsList, [{GoodsId, GoodsNum * CanExTimes1} | ExGoodsList]),
NewExList0 = case lists:keyfind(Index, 1, NewExList) of
false ->
lists:keystore(Index, 1, NewExList, {Index, CanExTimes1});
{_, AlExTimes} ->
lists:keystore(Index, 1, NewExList, {Index, AlExTimes + CanExTimes1})
end,
NewExList1 = ?IF_ELSE(CanExTimes1 == 0, NewExList, NewExList0),
NewScore1 = NewScore - CanExTimes1 * NeedScore,
exchange_goods(T, ExGoodsList1, NewExList1, NewScore1)
end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值