递归应用

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','','RMB',' drinking',Drink(10,2),"bottles drink" )

运行结果:

You Can Use 10 RMB  drinking  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函数计算换算的酒瓶数;

[03] Recursive Function递归应用的更多相关文章

  1. Recursive - leetcode [递归]

    经验tips: Recursion is the best friend of tree-related problems. 一是只要遇到字符串的子序列或配准问题首先考虑动态规划DP,二是只要遇到需要 ...

  2. T-SQL with as 的用法(转) SQL 下的递归查询 SQL2005(CTE) ,SQL2000(Function 递归)

    摘自: http://blog.csdn.net/bluefoxev/article/details/6779794 ------- SQL2005 方法 一.WITH AS的含义     WITH ...

  3. sql function递归

    alter function Fn_GetUserGroupRelation ( @DHsItemID int ) returns nvarchar(1024) begin declare @Col_ ...

  4. forward reference前向引用,gloal values and local values全局变量和局部变量,recursive function递归函数

    1.全局变量与局部变量练习 1 # -*- coding: UTF-8 -*- 2 def bar(): 3 print('from bar') 4 def foo(): 5 print('from ...

  5. React-router4 第七篇 Recursive Paths 递归路径

    https://reacttraining.com/react-router/web/example/recursive-paths import React from 'react' import ...

  6. Python~recursive function递归函数

    尾递归实现循环 def fact(n): if n==1: return 1 else : return n * fact(n-1) raw_input() 字符而非数字 unsupported op ...

  7. cs224d 自然语言处理作业 problem set3 (一) 实现Recursive Nerual Net Work 递归神经网络

    1.Recursive Nerual Networks能够更好地体现每个词与词之间语法上的联系这里我们选取的损失函数仍然是交叉熵函数 2.整个网络的结构如下图所示: 每个参数的更新时的梯队值如何计算, ...

  8. cs224d 作业 problem set3 (一) 实现Recursive Nerual Net Work 递归神经网络

    1.Recursive Nerual Networks能够更好地体现每个词与词之间语法上的联系这里我们选取的损失函数仍然是交叉熵函数 2.整个网络的结构如下图所示: 每个参数的更新时的梯队值如何计算, ...

  9. learning scala Function Recursive Tail Call

    可以使用scala库,可以从字面上看出是在调用 递归函数: code import scala.util.control.TailCalls._ val arrayDonuts: Array[Stri ...

随机推荐

  1. HTML学习(13)区块元素和内联元素

    HTML 区块元素 大多数 HTML 元素被定义为块级元素或内联元素. 块级元素在浏览器显示时,通常会以新行来开始(和结束). 实例: <h1>, <p>, <ul> ...

  2. Box/坐标/方向/Row

    1.Box, 我们在做design planning的第一步就是确定floorplan的box,也就是设计的区域.这个区域可以划分为三个边界,如下图所示: 上图中,按对应的颜色框框可以分为:Die B ...

  3. windows10桌面突然变灰了

    不靠谱的第三方软件重装系统,装了以后系统有点问题,会隔一段时间变灰 了 windows+ctrl+c 直接就恢复色彩了

  4. Bugku-CTF加密篇之进制转换(二进制、八进制、十进制、十六进制,你能分的清吗?)

    进制转换 二进制.八进制.十进制.十六进制,你能分的清吗?

  5. 自定义虚拟机MAC地址 | 它与 VMware 预留的 MAC 冲突 解法

    https://blog.csdn.net/wangrui1573/article/details/82056020 问题:我想给VMware ESXi上的一台虚拟机分配一个静态的MAC地址.然而当我 ...

  6. Mongodb学习笔记(三)性能篇

    一.索引管理 MongoDB提供了多样性的索引支持,索引信息被保存在system.indexes中MongoDB中_id字段在创建的时候,默认已经建立了索引,这个索引比较特殊,并且不可以删除,不过Ca ...

  7. 查看Mysql数据库版本

    一.使用终端 1.参数为-V(大写字母)或者--version 使用方法: D:\mysql\bin>mysql -V 或者 D:\mysql\bin>mysql --version

  8. 数论算法 Plus

    好像有不少更新:) 本文主要记录一些不是那么熟悉的高级数论算法的推导与应用. exBSGS算法 解决模数.底数不互质的离散对数问题. (1)为何\(BSGS\)算法不再适用:\(A\)不一定存在逆元, ...

  9. ios中ipa包的发布平台

    目前我所知的平台 1.蒲公英 目前 限制  金融类app  区块链类app的上传,小编的号因此刚被封号,而且交涉无果,不给解封,只有提交工单,包号注销了,再注册一个[建议看一下使用规则] 小编认为, ...

  10. Bugku-CTF加密篇之告诉你个秘密(ISCCCTF)

    告诉你个秘密(ISCCCTF)   636A56355279427363446C4A49454A7154534230526D6843 56445A31614342354E326C4B4946467A5 ...