递归

poj1664-放苹果(递归)

我的未来我决定 提交于 2020-03-26 20:08:09
一,题意:   M个苹果放在N个盘子里,允许有盘子空着,问共有多少种不同的分法。 二,思路:   递归的思想求解:     1,有反复执行的过程(调用本身)       第一种情况n>m : 必定有 n-m 个盘子空着,去掉不影响。       第二种情况n<=m :         i,有至少一个盘子空着;         ii,每个盘子都有苹果;         总的放苹果的方法数为两者之和: 2,有跳出反复执行过程的条件(递归出口)   当苹果放完或者只有一个盘子的时候    *递归两条路:     i,n会逐渐减少,最终到达出口 n==1 ;     ii,m逐渐减少,因为n>m时,return work(m,m),所以终会到达出口 m==0; 三,步骤:   1,if(n>m) work(m,n) = work(m,m) ;    else     i,work(m,n) = work(m,n-1);     ii,work(m,n) = work(m-n,n);    work(m,n) = work(m,n-1) + work(m-n,n);   2,if(m==0||n==1) return 1; 1 #include<iostream> 2 using namespace std; 3 4 int work(int m , int n){ 5 if(m==0||n

POJ - 1664 放苹果(递归)

一曲冷凌霜 提交于 2020-03-26 19:51:08
题意:把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。 分析:枚举每个盘子可以放的苹果数都是0~M,最后去重就可以了。 #pragma comment(linker, "/STACK:102400000, 102400000") #include<cstdio> #include<cstring> #include<cstdlib> #include<cctype> #include<cmath> #include<iostream> #include<sstream> #include<iterator> #include<algorithm> #include<string> #include<vector> #include<set> #include<map> #include<stack> #include<deque> #include<queue> #include<list> #define Min(a, b) ((a < b) ? a : b) #define Max(a, b) ((a < b) ? b : a) typedef long long ll; typedef unsigned long long llu; const int INT_INF =

poj1664放苹果(递归)

两盒软妹~` 提交于 2020-03-26 18:33:26
题目链接 : http://poj.org/problem?id=1664 放苹果 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 37273 Accepted: 22957 Description 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。 Input 第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。 Output 对输入的每组数据M和N,用一行输出相应的K。 Sample Input 1 7 3 Sample Output 8解题思路:就是n个球放m个盒子的问题,采用递归的思想,定义函数func(n,m)为n个苹果放入m个盘子,可以分为两种情况:第一种,当m>n, 则总会有m-n个盒子空着,去掉他们对总的放法不产生影响,即 if(m > n) f(n, m) = f(n, n)第二种,当n<=m时,可以分为两种:  1.至少有一个盒子空着,则 f(n, m) = f(n, m-1);  2.所有盒子都有球,我们可以从每个盒子中拿掉一个球而不影响总的放法,则 f(n, m) = f(n-m, m);所以当n<=m时,f(n, m)=f(n, m-1)

放苹果(poj1664递归)

给你一囗甜甜゛ 提交于 2020-03-26 18:32:27
ti 放苹果 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 24392 Accepted: 15513 Description 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。 Input 第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。 Output 对输入的每组数据M和N,用一行输出相应的K。 Sample Input 1 7 3 Sample Output 8ps:http://poj.org/problem?id=1664题意:略。。。详见代码。 /* 解题分析: 设f(m,n) 为m个苹果,n个盘子的放法数目,则先对n作讨论, 当n>m:必定有n-m个盘子永远空着,去掉它们对摆放苹果方法数目不产生影响。即if(n>m) f(m,n) = f(m,m)   当n<=m:不同的放法可以分成两类: 1、有至少一个盘子空着,即相当于f(m,n) = f(m,n-1); 2、所有盘子都有苹果,相当于可以从每个盘子中拿掉一个苹果,不影响不同放法的数目,即f(m,n) = f(m-n,n). 而总的放苹果的放法数目等于两者的和,即 f(m,n) =f(m,n-1

相互递归

血红的双手。 提交于 2020-03-26 13:22:16
相互递归 都知道递归对于编程的重要性,今天就来谈谈相互递归。 若2者之间存在递推关系,则可以使用相互递归。下面举2个例子。 求pi 根据公式 # pi/4 = 1 - 1/3 + 1/5 -1/7 + 1/9 - ... def calPi(n): piDiv4 = 0 def neg(a): nonlocal piDiv4 if a > 1: piDiv4 -= 1/a pos(a-2) #当a<=1, 函数终结 def pos(b): nonlocal piDiv4 piDiv4 += 1/b neg(b-2) pos(n) if ( (n//2) % 2 == 0) else neg(n) print(4*piDiv4) 上面的相互递归,只要一方终结、另一方也会因此结束(此处的终结指不再return函数,结束相互递归的过程),neg与pos的关系还能写成下面的方式: #上面是neg终结、此处是pos终结 def neg(a): nonlocal piDiv4 piDiv4 -= 1/a pos(a-2) def pos(b): nonlocal piDiv4 if b > 1: piDiv4 += 1/b neg(b-2) else: piDiv4 += 1 #终结 通常相互递归可以通过增加一个参数来抵消掉。 def calPi2(n): flag = 1 if (n//2)

【剑指Offer-循环和递归】面试题10.4:矩形覆盖

别来无恙 提交于 2020-03-26 11:07:29
题目描述 我们可以用2x1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2x1的小矩形无重叠地覆盖一个2xn的大矩形,总共有多少种方法? 思路 可以推一下:用2x1的小矩形覆盖2x1的大矩形共1种方法,覆盖2x2的矩形共2种方法,覆盖2x3的矩形共3种方法,覆盖2x4的矩形共5种方法,可以看出方法数满足斐波那契数列。 如上图所示,把使用2x1的矩形覆盖2x8的矩形的放法数记为f(8),则用第一个2x1的矩形覆盖时有两种放法:(1)竖着放,此时右边剩下2x7的区域,所以放法数还剩f(7);(2)横着放,此时左下角必须再横着放一个2x1的矩形,此时还剩下2x6的区域,所以剩余放法数f(6),所以f(8)=f(7)+f(6)。 代码如下: class Solution { public: int rectCover(int number) { if(number<1) return 0; int a[2]; a[0] = 1; a[1] = 2; if(number<=2) return a[number-1]; for(int i=2; i<number; i++){ int t = a[0] + a[1]; a[0] = a[1]; a[1] = t; } return a[1]; } }; 来源: https://www.cnblogs.com/flix/p/12572577

27、Python之函数递归

送分小仙女□ 提交于 2020-03-26 08:47:37
目录 一、递归的定义 二、递归的两个阶段 三、递归的应用 一、递归的定义 # 函数的递归调用:是函数嵌套调用的一种特殊形式 # 具体是指: # 在调用一个函数的过程中又直接或者间接地调用到本身 # 直接调用本身 def f1(): print('是我是我还是我') f1() f1() # 间接接调用本身 def f1(): print('===>f1') f2() def f2(): print('===>f2') f1() f1() # 一段代码的循环运行的方案有两种 # 方式一:while、for循环 while True: print(1111) print(2222) print(3333) # 方式二:递归的本质就是循环: def f1(): print(1111) print(2222) print(3333) f1() f1() ## 需要注意的是:递归调用不应该无限地调用下去,必须在满足某种条件下结束递归调用 二、递归的两个阶段 # 回溯:一层一层调用下去 # 递推:满足某种结束条件,结束递归调用,然后一层一层返回 age(5) = age(4) + 10 age(4) = age(3) + 10 age(3) = age(2) + 10 age(2) = age(1) + 10 age(1) = 18 def age(n): if n == 1: return

[转] [博客园] 迷宫生成算法x4

余生长醉 提交于 2020-03-25 22:44:20
简介 所谓迷宫生成算法,就是用以生成随机的迷宫的算法 迷宫生成算法是处于这样一个场景: 一个row行,col列的网格地图,一开始默认所有网格四周的墙是封闭的 要求在网格地图边缘,也就是网格的边上打通2面墙 所有网格都至少保证网格周围至少有一堵墙打通 所有网格都能通过打通的墙能形成一条通路 博主已实现RecursiveBacktracking(递归回溯),RecursiveSegmentation(递归分割),随机Prim算法,Kruskal+并查集四种迷宫生成算法,这篇文章主要对这四种算法进行简要的介绍 基于Unity的迷宫生成算法代码实现 Github链接 递归回溯算法 复杂度 空间:O(n),时间:O(n),n为迷宫节点数row*col 原理 以一个栈作为辅助的数据结构,用以记录打通区域的顺序,用以回溯 一开始随机在地图中选择一个区域,加入栈。 之后在之前选择的区域周围随机选择一个未打通的区域,将新选择的区域和之前选择区域的墙打通,并把新的区域的加入栈 如果四周的区域都打通,就让栈出栈,将当期所选择的区域设置栈新的栈顶,表示回退到上一个区域 之后递归的按之前的步骤选择下一个区域直到所有区域都被打通 缺点 这种算法实现思路极为简单,但通路过于明显,甚至有可能会出现上图中的迷宫,很尴!!! 递归分割算法 复杂度 递归空间复杂度:O(row * col),最好时间复杂度:O

Python2X学习13-python-函数

核能气质少年 提交于 2020-03-25 17:32:51
Python不但能非常灵活地定义函数,而且本身内置了很多有用的函数,可以直接调用。 要调用一个函数,需要知道函数的名称和参数 1、内置函数举例:    1)、求绝对值的函数 abs() ,它接收一个参数 也可以在交互式命令行通过 help(abs) 查看abs函数的帮助信息。 print abs(-120) # == > 120 print abs(-120, -100) # == > TypeError: abs() takes exactly one argument (2 given) print abs('a') # == > TypeError: bad operand type for abs(): 'str' 调用函数的时候,如果传入的参数数量不对,会报TypeError的错误,并且Python会明确地告诉你:abs()有且仅有1个参数,但给出了两个 如果传入的参数数量是对的,但参数类型不能被函数所接受,也会报TypeError的错误,并且给出错误信息:str是错误的参数类型    2)、比较函数 cmp(x, y) 就需要两个参数,如果 x<y,返回 -1,如果 x==y,返回 0,如果 x>y,返回 1 print cmp(1, 2) # == > -1 print cmp(2, 1) # == > 1 print cmp(2, 2) # == > 0    3)

python递归函数

心不动则不痛 提交于 2020-03-25 17:26:17
递归函数的介绍 函数的递归调用:本质是函数嵌套调用的一种特殊形式,简单的讲就是在 调用一个函数的过程中又直接或间接地调用该函数本身 直接调用函数本身 示例: def f1(): print('是我是我还是我') f1() f1() 间接调用函数本身 示例: def f1(): print('from f1') f2() def f2(): print('from f2') f1() f1() 从上面两个图可以看出,两种情况下的递归调用都是一个无限循环的过程,但在python对函数的递归调用的深度做了限制,因而并不会像大家所想的那样进入无限循环,会抛出异常,要避免出现这种情况,就 必须让递归调用在满足某个特定条件下终止 。 提示: #1. 可以使用sys.getrecursionlimit()去查看递归深度,默认值为1000,虽然可以使用 sys.setrecursionlimit()去设定该值,但仍受限于主机操作系统栈大小的限制 #2. python不是一门函数式编程语言,无法对递归进行尾递归优化。 代码循环运行的两种方式(死循环) # 方式一:while、for循环 while True: print(1111) print(2222) print(3333) # 方式二:递归的本质就是循环: def f1(): print(1111) print(2222) print