[03] Recursive Function递归应用
递归应用
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递归应用的更多相关文章
- Recursive - leetcode [递归]
经验tips: Recursion is the best friend of tree-related problems. 一是只要遇到字符串的子序列或配准问题首先考虑动态规划DP,二是只要遇到需要 ...
- T-SQL with as 的用法(转) SQL 下的递归查询 SQL2005(CTE) ,SQL2000(Function 递归)
摘自: http://blog.csdn.net/bluefoxev/article/details/6779794 ------- SQL2005 方法 一.WITH AS的含义 WITH ...
- sql function递归
alter function Fn_GetUserGroupRelation ( @DHsItemID int ) returns nvarchar(1024) begin declare @Col_ ...
- 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 ...
- React-router4 第七篇 Recursive Paths 递归路径
https://reacttraining.com/react-router/web/example/recursive-paths import React from 'react' import ...
- Python~recursive function递归函数
尾递归实现循环 def fact(n): if n==1: return 1 else : return n * fact(n-1) raw_input() 字符而非数字 unsupported op ...
- cs224d 自然语言处理作业 problem set3 (一) 实现Recursive Nerual Net Work 递归神经网络
1.Recursive Nerual Networks能够更好地体现每个词与词之间语法上的联系这里我们选取的损失函数仍然是交叉熵函数 2.整个网络的结构如下图所示: 每个参数的更新时的梯队值如何计算, ...
- cs224d 作业 problem set3 (一) 实现Recursive Nerual Net Work 递归神经网络
1.Recursive Nerual Networks能够更好地体现每个词与词之间语法上的联系这里我们选取的损失函数仍然是交叉熵函数 2.整个网络的结构如下图所示: 每个参数的更新时的梯队值如何计算, ...
- learning scala Function Recursive Tail Call
可以使用scala库,可以从字面上看出是在调用 递归函数: code import scala.util.control.TailCalls._ val arrayDonuts: Array[Stri ...
随机推荐
- 问题总结:mysql和javaweb工程连接的过程中容易产生的问题
问题背景:自己在本机的mysql8瘫痪了,将Oracle中的数据迁移到mysql之后,配置好javaweb工程和虚拟机上的远程Mysql连接的文件之后:遇见了无法访问的问题 具体的配置: dataso ...
- 初识hadoop --- (分布式文件系统 + 分块计算)
[转载] + 整理 2016-11-18 使用范围: Hadoop典型应用有:搜索.日志处理.推荐系统.数据分析.视频图像分析.数据保存等. Hadoop历史 雏形开始于2002年的Apache的Nu ...
- SQL Server带列名导出到Excel(Export to CSV with headers)的几个思路
https://www.cnblogs.com/downmoon/archive/2012/05/04/2482995.html SQL Server 2008中SQL应用系列及BI学习笔记系列- ...
- python eval() 进行条件匹配
最近开发一个功能,根据条件表达式过滤数据,其中用到了eval(条件字符串,字典) 发现一个现象: >>> print u"campGrade in [ '\u51cf\u8 ...
- [爬坑记录] Qt 代码卡住 不发信号 不触发槽
先让我激动一会儿 [捂脸] 最近在用Qt做个程序 用来参加比赛 期间总共遇到两次如标题的问题 也即是 莫名其妙的不触发槽函数了 而且原因也不一样 {先说明 我学习Qt依旧只是入门级 也许入不了大佬法眼 ...
- Nexus坑人系列-license格式问题
这种情况一般出现在RMA或者新设备使用的时候.这些时候一般需要安装license,在安装完license的时候,例如我们去配置一些三层特性,例如feature eigrp等,可能会出现设备拒绝了你的命 ...
- Java出现NoSuchElementException异常
参考网址:https://blog.csdn.net/xiao_ma_csdn/article/details/78906650 出现这个异常是线程访问越界,这个时候就要检查下到底是哪里越界. 原因是 ...
- radar图生成用户guideline
1.最后生成的效果是这样的: 2.第一个对话框如下(包含了样图),用于输入维度个数[最小为4,最大不限]: 3.第二个对话框如下,根据维度个数生成了信息录入表[每个维度3个信息,每3个一次重复,不清楚 ...
- 其他 - win10 paged pool 内存溢出
1. 概述 win 10 内存时不时溢出 目前还没有跟踪完毕 有空继续跟踪 2. 问题 win10 内存动不动就 往上涨 只涨不降 看各个进程又是正常的 3. 思路 先看看内存情况 妈的我 jvm 的 ...
- 分析AppClassLoader,ExtClassLoader 和URLClassLoader 的关系
测试代码: class Hello { public String str = "Hello World"; public void fun() { System.out.prin ...