【Python函数的递归】
递归的定义
函数作为一种代码封装,可以被其他程序调用,当然,也可以被函数内部代码调用。这种函数定义中调用函数自身的方式称为递归。就像一个人站在装满镜子的房间中,看到的影像就是递归的结果。递归在数学和计算机应用上非常强大,能够非常简洁的解决重要问题。
以求阶乘为例
#计算阶乘:根据用户输入的整数n,计算并输出n的阶乘值。
def fact(n):#计算阶乘if n == 0:return 1else:return n * fact(n-1)num = eval(input("请输入一个正整数: "))
print(fact(num))
递归函数调用过程 ![](/assets/blank.gif)
递归的思想
把规模大的问题转化为规模小的、具有与原来问题相同解法的问题来解决。在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了函数调用它自身的情况。
递归的使用方法
- 找到递归关系,即把一个复杂的问题转化为与它形式相似、但规模较小的问题
- 找到递归出口,即问题转化时,当规模足够小,可以直接求解
递归法练习
1.字符串反转
对于用户输入的字符串s,输出反转后的字符串。解决这个问题的基本思想是把字符串看作一个递归对象。
def rev(s): # 反转字符串if len(s) == 1:return selse:return s[-1]+rev(s[:len(s)-1])s = input()
print(rev(s))
2.斐波那契数列(1、1、2、3、5、8、13、21、34、……)
兔子繁殖问题:
在700多年前,意大利著名数学家斐波那契在《算盘全集》中提到这样一个问题:一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,第n个月有多少对兔子?
F(1)=1
F(2)=1
F(3)=F(1)+F(2)=1+1=2
F(4)=F(2)+F(3)
…………
F(N)=F(N-2)+F(N-1)
代码
def fab(n):if n <= 2:return 1else:return fab(n-1)+fab(n-2)n = eval(input())
print(fab(n))
斐波那契的递归实现版本里面有很多冗余计算,可以通过增加缓存来优化。
# -*- coding: UTF-8 -*-
# 斐波那契数列 递归
def fibonacci_inner(n, cache):if n == 1 or n == 2:return 1r = 0# 实现缓存if cache.get(n) is not None:return cache[n]else:cache[n] = fibonacci_inner(n-1, cache) + fibonacci_inner(n-2, cache)return cache[n]def fibonacci(n):return fibonacci_inner(n, {})if __name__ == '__main__':n = eval(input())print(fibonacci(n))
3.赶鸭子问题
题目描述
一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?
分析
设经过的村子为n (n = 0,1,2,...,7),根据题目分析可知递归结束的出口: n = 7时,剩余鸭子数duck = 2;
分析递归体:从后向前推 n=7时 ,duck = 2, 由于每经过一个村子,卖去所赶鸭子的一半又一只,因此七个村子后剩余的鸭子数 duck[7]=duck[6]-(duck[6]/2+1)
反推duck[6] = (duck[7] + 1) * 2
最终递归体: (duck[n+1] + 1) * 2;
综上
n=7 | duck=2 |
0<=n<7 | duck=(duck(n+1) + 1) * 2 |
代码
def duck(n):if n == 7:return 2else:return (duck(n+1)+1)*2print("鸭子的总数为:{}".format(duck(0)))
sum = duck(0)
for i in range(1, 8):print("第{}个村庄卖出{}只鸭子,剩余鸭子数为{}". format(i, sum-duck(i), duck(i)))sum = duck(i)
运行结果
4.角谷定理
题目描述
角谷定理。输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。经过如此有限次运算后,总可以得到自然数值1。求经过多少次可得到自然数1。
示例 | 输入 | 输出 |
示例1 | 22 |
11 34 17 52 26 13 40 20 10 5 16 8 4 2 1 step=15 |
示例2 | 33 |
16 8 4 2 1 step=5 |
问题分析
递归出口:当输入的数字为1时,则直接输出
递归体:当输入数据不为1时
- 当数据为偶数:除以2,递归直到数据为1,输出
- 当数据为奇数:乘3再加1,递归直至数据为1,输出
# 角谷定理
def jiaogu(step, n):if n == 1:return stepelse:if n % 2 == 0:step += 1print("{:.0f}".format(n/2), end=" ")return jiaogu(step, n/2)else:step += 1print("{:.0f}".format(n*3+1), end=" ")return jiaogu(step, n*3+1)n = eval(input())
m = jiaogu(0, n)
print("\n需要经过{}次运算".format(m))
5.分橘子问题
题目描述
日本著名数学游戏专家中村义作教授提出这样一个问题:父亲将2520个桔子分给六个儿子。分完 后父亲说:“老大将分给你的桔子的1/8给老二;老二拿到后连同原先的桔子分1/7给老三;老三拿到后连同原先的桔子分1/6给老四;老四拿到后连同原先的桔子分1/5给老五;老五拿到后连同原先的桔子分1/4给老六;老六拿到后连同原先的桔子分1/3给老大”。结果大家手中的桔子正好一样多。问六兄弟原来手中各有多少桔子?
分析:
老大得到老六分给的桔子后,每个人的桔子总数为总数的平均即2520/6=420个
针对老大所得桔子数 = (420 - 从老六那里所得桔子数)*7/8, 老六分给老大其1/3之后剩余420个,因此他有420*3/2 = 630个桔子,即分给老大210个
则可以算出老大在得到老六桔子之前有420-210 = 210个由于老大将其1/8分给老二,则可算出老大最初拥有240个桔子
......
代码
'''
n 表示第几个儿子
beforenum 表示分配之前的橘子数
afternum 表示分配之后的橘子数
m 表示分配的比例
'''def orange(n, beforenum, afternum, m):if n > 6:return 0else:print("老" + str(n) + "原有橘子数" + str(beforenum) + "个")# 分给下一个人的橘子数givenum = afternum / m# 下一个人的橘子数nextbeforenum = 420 * (m - 1) / (m - 2) - givenum# 下一人加上之前的橘子数的总数aftergetnum = nextbeforenum + givenumreturn orange(n + 1, nextbeforenum, aftergetnum, m - 1)orange(1, 240, 240, 8)
运行结果
【Python函数的递归】相关推荐
- Python函数的递归调用
一:递归的定义 函数的递归调用:是函数嵌套调用的一种特殊形式 具体是指: 在调用一个函数的过程中又直接或者间接地调用到本身 # 直接调用本身 def f1():print('是我是我还是我')f1() ...
- python函数的递归小兔子_python中函数递归
函数递归简单的来说就是函数自己调用自己,实现和循环类似的效果,通过return关键字来实现自己调用自己. 一个简单的循环例子,1~100的累加,这可能是很多人学习循环编写的第一个程序,用循环和递归分别 ...
- python函数可以递归调用吗_递归调用函数
我有10张,20张,50张钞票,当我需要支付任何金额时,我需要找到最好的组合.例如,当我需要付7英镑时,我会付5英镑和2英镑的钞票 我有一个函数可以计算这个.但我需要运行同一个函数3到4次,如下所示. ...
- python之理解——递归
古之欲明明德于天下者,先治其国:欲治其国者,先齐其家:欲齐其家者,先修其身:欲修其身者,先正其心:欲正其心者,先诚其意:欲诚其意者,先致其知,致知在格物.物格而后知至,知至而后意诚,意诚而后心正,心正 ...
- python 函数递归一次增加一次变量_python3--函数(函数,全局变量和局部变量,递归函数)...
1.1函数 1.1.1什么是函数 函数就是程序实现模块化的基本单元,一般实现某一功能的集合. 函数名:就相当于是程序代码集合的名称 参数:就是函数运算时需要参与运算的值被称作为参数 函数体:程序的某个 ...
- python函数归值_Python函数基础与函数递归
数学中函数的定义: 一般的 在一个变化过程中, 如果有两个变量 x 和 y 并且 对于 x的每一个确定的值,y都有唯一确定的值与 其对应, 那么我们就把 x 成为 自变量 把y成为 因变量 y是x的函 ...
- python函数递归 汉诺塔
4.7 python函数递归 汉诺塔 代码: def hanno(n,A,B,C):global stepif n==1:print('{}->{}'.format(A,C))step +=1e ...
- python函数递归 斐波那契数列
4.7 python函数递归 斐波那契数列 代码:(利用递归.format输出等) def fibonacci(n):if n==1 or n==2:f=1else:f=fibonacci(n-1)+ ...
- python函数递归 字符串反转
4.7 python函数递归 字符串反转 代码: def fanzhuan(s):if len(s)==1:s2=selse:s2=s[-1]+fanzhuan(s[:len(s)-1])return ...
最新文章
- PHP问题 —— 丢失SESSION
- ASP.NET 打包多CSS或JS文件以加快页面加载速度的Handler
- Flask爱家租房--房屋管理(搜索房屋列表)
- LintCode 183. 木材加工(二分查找)
- java 类加载 双亲委派_Java类加载器和双亲委派机制
- apache 日志参数
- parse python函数_Python爬虫 - parse模块常用方法
- Java添加多行数据到mysql中_Java:使用PreparedStatement将多行插入到MySQL中
- JavaScript计时
- VS2008开发Silverlight程序用到的插件
- 机器人开发--OS系统介绍
- 背景图片自适应屏幕大小CSS写法
- Mysql集群原理整理
- opencv2 Mat类copyTo()函数的内存泄露问题
- 吴军,阅读与写作,11,写景:如何寓情于景?
- 【bzoj4011】【HNOI2015】落忆枫音【树形DP】
- 不懂不要炒股,一定要在调整时买入股票!
- 零基础入门金融风控之贷款违约预测—特征工程
- dd 命令的使用方法
- 低代码与BPM有什么区别?