递归应用
1.理解
百科:一种计算过程,如果其中每一步都要用到前一步或前几步的结果,称为递归的;
理解:函数调用自己的过程,这类函数处理的事情具有重复性,处理此类实行可用while或者for,但结构上不够简便;
关注项:
1)如果采用递归求解一个重复过程的结果,需要知道何时结束,不能一直调用自己,所以引用了“基线条件”和“递归条件”;当满足基线条件时停止调用函数本身,结束递归;
2)递归过程数据调用采用“栈”的形式,即先进后出;
扩展:
D&C(Divide and Conquer)分而治之:一种递归式的问题解决方法,对解决递归问题提供了方法;D&C解决递归问题的过程:
1)找出基线条件,该条件必须尽可能简单;
2)不断将问题分解或缩小规模,直到符合基线条件;
2.场景应用
来自聊天中的需求:
对需求进行分析,必须用10元钱取买酒才会获得瓶子,获得瓶子就会获得瓶盖和空瓶子,瓶盖和空瓶反过来获得酒,酒在获得空瓶和瓶盖,所以最后的问题就是酒和空瓶、瓶盖的来回“兑换”问题,所以该问题属于递归问题;
根据解决递归的方法,找出递归条件和基线条件,其实递归条件和基线条件已经体现在了需求中,即瓶盖和空瓶的数量;
1)基线条件确定
瓶盖数caps<4 & 空瓶数emptys<2
2)递归条件确定
瓶盖数caps≥4 & 空瓶数emptys≥2
3.功能实现
3.1)Python 递归
import math def Drink(money,price): global caps,emptys,out caps = 0 emptys = 0 out = []#定义缓存,用于存放每次兑换喝的酒 if money >= 2: out.append(math.floor(money/price)) #整除2,看够不够买酒钱 caps = out[0] emptys = out[0] rec(caps,emptys) num = sum(out) #计算喝酒总量 return num def Caps(total_caps): left_caps = total_caps % 4 #获取剩余的瓶盖 out2 = math.floor(total_caps/4) #瓶盖兑换后的酒的个数 return(out2,left_caps) def Emptys(total_emptys): left_emptys = total_emptys % 2 #获取剩余的空瓶 out3 = math.floor(total_emptys/2) #空瓶兑换后的酒的个数 return(out3,left_emptys) def rec(caps,emptys): if caps >= 4 or emptys >= 2: #递归条件条件,也是基线条件 if caps >= 4: out2, left_caps = Caps(caps) caps = out2 + left_caps emptys = emptys + out2 #兑换的酒累加到空瓶中 out.append(out2) if emptys >= 2: out3, left_emptys = Emptys(emptys) emptys = out3 + left_emptys caps = caps + out3 #兑换的酒累加到瓶盖中 out.append(out3) return rec(caps,emptys) else: #基线条件退出 ,返回递归结果 return out print ('You Can Use','10','RMB',' drinking',Drink(10,2),"bottles drink" )
运行结果:
You Can Use 10 RMB drinking 15 bottles drink
小结:
1)在python中定义空列表:var=[] ,在对var赋值时可以通过var.append(value),直接赋值,索引位置会根据增加的变量自动往后移;
2) 在python中取余用 % 号,向下取整需要调用math库,函数与matlab一样的floor;
3)递归函数是rec(caps,emptys),该函数被Drink函数调用,将最初的10元钱获取的瓶盖和空瓶传递过去,统一了变量,即可进行递归应用;
3.2)Matlab While循环
function [num] = Drink(money,price) global caps emptys caps = 0; emptys = 0; t = 0; out = []; out2 = 0; out3 = 0; if money>=2 t = +1; out(t,1) = floor(money/price); end caps = out(t,1); emptys = out(t,1); while caps>=4|emptys>=2 if caps>=4 [out2,left_caps] = Caps(caps); caps = out2+left_caps; emptys = emptys+out2; t = t+1; out(t,1) = out2; end if emptys>=2 [out3,left_emptys] = Emptys(emptys); emptys = out3 + left_emptys; caps = caps+out3; t = t+1; out(t,1) = out3; end end num = sum(out); function [out2,left_caps] = Caps(total_caps) if total_caps >= 4 left_caps = mod(total_caps,4); out2 = floor(total_caps/4); end function [out3,left_emptys] = Emptys(total_emptys) if total_emptys >= 2 left_emptys = mod(total_emptys,2); out3 = floor(total_emptys/2); end
运行结果与Python一致;
小结:
1)mod取余,计算剩余的空瓶或瓶盖;
2)利用floor函数计算换算的酒瓶数;