Python递归函数的运用

什么是递归函数?
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
意义:通过一定的“基”,并按照某种规则达到重复的效果

递归函数实现斐波那契数列
斐波那契数列的定义:
斐波那契数列指的是这样一个数列 :
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368…
这个数列从第3项开始,每一项都等于前两项之和。

关键点在于每一项都等于前两项之和。意思是:如果我们想计算这个数列的某一个数,我们得先知道这个数的前两个数是多少。假设这个数的前两个数分别为a, b.
那么这个‘基’就可以得出来了:a和b。
那么这个数列遵循的规则也可以得出来了:a+b
那么我们用函数来求斐波那契数列中的某一个数吧。(不用递归)

def fib(n):# n为数列中的第几个数
  if n == 1 or n == 2:
    return 1
  a, b = 1, 1
  n -= 2
  while n > 0:
    a, b = b, a + b
    n -= 1
  return b

使用递归:

def fib(n):
  if n == 1 or n == 2:
    return 1
  return fib(n-1) + fib(n-2)

使用递归函数实现汉诺塔

直接上数学模型

有三根相邻的柱子,标号为1,2,3,柱子1上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子3上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方。

让我们来寻找这个数学模型中的‘基’和规则吧。

我们发现每一次的移动数等于上一次的移动数×2+1。那么我们是不是可以假设每一次的汉诺塔的移动都在一定程度上基于上一次的移动。我们用具体事例验证下。
因为n=1与n=2之间太过于简单,很难找到明显的规律。所以我们比对n=2与n=3
当n=3时
基于上述的发现(每一次的移动数等于上一次的移动数×2+1)我们将这一次的移动分为三个部分。因为移动是有一定规律的,所以我们只能有三种分法:(3,3,1),(1,3,3),(3,1,3)
通过比对所有的移动方法,我们可以发现最中间的那一次移动都是“1 --> 3”。所以我们确定分法为(3,1,3)
我们将n=3与n=2进行比较

我们会发现:将n=2中的柱子2、3进行交换就可以得到n=3的第一部分,将n=3中的柱子1、2交换就可以得到n=3的第三部分。

同理去推n=1与n=2、n=4与n=3之间的关系,我们会得到同样的结论。

而且n=1时的移动(1 --> 3)还给了我们一个明确的信息:我们移动的最终目的都是将所有盘子从柱子1移动到柱子3。

因为‘基’是n=1,所以有:

def hano(n, a, b, c):
  if n == 1:
  print(a, ‘-->‘, c)

根据规则可以写出:

hano(n - 1, a, c, b)
print(a, ‘-->‘, c)
hano(n - 1, b, a, c)

再优化一下:

def hano(n, a, b, c):
  if n == 1:
    print(a, ‘-->‘, c)
  return
hano(n - 1, a, c, b)
print(a, ‘-->‘, c)
hano(n - 1, b, a, c)

a, b, c = "1", "2", "3"
print("这是汉诺塔游戏!")
n = int(input("请输入汉诺塔的层数:"))
hano(n, a, b, c)

给大家留个小题:

有三根相邻的柱子,标号为1,2,3,柱子1上从下到上叠着n个盘子,叠的方式为:一黑一白交替相叠,白色的总在最下面。要把所有盘子一个一个移动到柱子3上,使最终的柱子3呈现的结果为:白色盘子全部在下面,黑色盘子全部在上面。怎样移动使步骤最少。大家可以试试用递归的方法模拟。

上述只是小弟的一点愚见,代码并没有经过大量测试,可能有误,欢迎各位大佬在评论区里;留言指出。感谢大家的阅读

原文地址:https://www.cnblogs.com/gease6/p/10657645.html

时间: 2024-10-11 13:46:35

Python递归函数的运用的相关文章

Python 递归函数 详解

Python 递归函数 详解   在函数内调用当前函数本身的函数就是递归函数   下面是一个递归函数的实例: 第一次接触递归函数的人,都会被它调用本身而搞得晕头转向,而且看上面的函数调用,得到的结果会是: 为什么会得出上面的结果呢?因为都把调用函数本身之后的代码给忘记了,就是else之后的python 代码. 实际此递归函数输出的是以下结果: 相信大家看到这里都有点蒙,小编也一样,我第一次看到这个递归函数时,只能理解到第一个结果.那是因为,大部分人在做事情的时候,中断第一件事,被安排去做第二件事

python递归函数(10)

一个函数在函数体内部调用自己,这样的函数称为递归函数,递归的次数在python是有限制的,默认递归次数是997次,超过997次会报错:RecursionError. 一.递归函数案例 案例一:计算数字N的阶乘(举个栗子:9的阶乘 = 9*8*7*6*5*4*3*2*1) # !usr/bin/env python # -*- coding:utf-8 _*- """ @Author:何以解忧 @Blog(个人博客地址): shuopython.com @WeChat Offi

python递归函数下不能正常使用yield

# -*- coding:utf-8 -*- import os import time file_list = [] def findFile(path): listFile = os.listdir(path) for file in listFile: try: file =os.path.join(path,file) if os.path.isfile(file): yield file # test1 #file_list.append(file) # test2 #print(fi

python递归函数

1.递归函数:简单点说就是自己调用自己,递归函数必须有一个明确的结束条件,python中默认的最大递归次数为999次,其目的是保护资源不被耗尽 2.每次进入更深一层次递归时,问题规格相经上次递归都应有所减少 3.递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈这种数据结构实现的,每当进入一个函数调用时,会增加一个栈帧,每当函数返回时,就会减少一个栈帧,由于栈的大小不是无限的,所以递归调用的次数过多,会导致栈溢出)

python—递归函数

递归函数 定义:即在函数定义中自己调用自己 递归就是在过程或函数中自我调用 递归必须有递归出口,即递归结束条件 举个栗子-阶乘: def fact(n): if n == 1: return 1 return n * factorial(n - 1) print(factorial(5)) # 120 函数执行过程: ===> fact(5) ===> 5 * fact(4) ===> 5 * (4 * fact(3)) ===> 5 * (4 * (3 * fact(2))) =

Python递归函数与匿名函数

递归函数 Python对递归的深度有限制,超过即会报错.所以一定一要注意跳出条件. #斐波拉契数列 #一个数列,第一个数是1,第二个数也是1,从第三个数开始,每一个数是前两个数之和 #公式:f(1) =1, f(2) = 1, f(3) = f(1) + f(2), ..., f(n) = f(n-2) + f(n-1) #例如:1, 2, 3, 5, 8, 13, 21... def fib(n): if n == 1: return 1 elif n == 2: return 1 else:

python递归函数及二分法查找

函数的递归: 在一个函数的内部调用自己 死循环: 可以无限循环,不会停止 while True: print('我不是递归') 递归: 不是死循环,有最大循环深度 def story(): print('我是递归') story() story() 超过了递归的最大深度报错 RecursionError: maximum recursion depth exceeded while calling a Python object 官网上 源码中设置的递归深度: 1000自己实际测试递归深度: 9

Python递归函数如何写?正确的Python递归函数用法!

在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数.一.举个例子,我们来计算阶乘n! = 1 x 2 x 3 x … x n,用函数fact(n)表示,可以看出:fact(n) = n! = 1 x 2 x 3 x … x (n-1) x n = (n-1)! x n = fact(n-1) x n所以,fact(n)可以表示为n x fact(n-1),只有n=1时需要特殊处理.ps:另外很多人在学习Python的过程中,往往因为没有好的教程或者没人指导从而导致

Python递归函数与斐波那契数列

定义:在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 阶乘实例 1 n = int(input(">>:")) 2 3 4 def f(n): 5 s = 1 6 for i in range(2, (n + 1)): 7 s *= i 8 return s 9 print(f(n)) 递归 1 def factorial_new(n): 2 3 if n==1: 4 return 1 5 return n*factorial_new(