Python:递归算法(基础)

递归的定义:

  • 其实就是自己调用自己

递归的特征:

  • 存在一个或者多个基例,基例并不需要调用自己,它是一个确定的表达式

  • 所有的递归链结尾均是基例。

递归的运行原理:

  • 递归调用函数自动在内存里开辟新的地址,临时存储过程数据。
  • 递归包含两个过程——出栈和进栈。递归调用过程是入栈操作过程,递归返回过程是出栈操作过程。

概念比较抽象,下面我们来看一个最简单的递归函数

累加求和递归函数

def leijia(n=3):
    if n==1:
        return 1
    else:
        return n+leijia(n-1)
print('累加结果{}'.format(leijia(900)))

输出结果如下:

累加结果405450

注意:递归调用受到内存限制,使用递归函数需要预防栈的溢出。Python中递归函数最多调用1000次,超过1000次将会出现如下报错:

RecursionError: maximum recursion depth exceeded while calling a Python object

如何解决这个问题呢?
直接选择修改递归默认次数。代码如下:

import sys
sys.setrecursionlimit(1500)
def leijia(n=3):
    if n==1:
        return 1
    else:
        return n+leijia(n-1)
print('累加结果{}'.format(leijia(1000)))

​输出结果如下:

累加结果500500

但是我们设置默认次数为20000,输入值为10000时,会出现没有输出的情况。程序直接结束。当然,不一定是20000和10000,其他较大的值也是一样。对于这点,你问我吗,我木知啊。

等等,我的下篇文章会讲到哦。这篇只涉及基础哦。接下来这里有几道题读者可以尝试一下。

一:Real Small Water Problem
题目描述:
Give you a positive integer n.
Function F_x satisfies:
F_(0) = sin{n}
F_(x) = sin{F_(x-1)} (x>0)
Calculate F_(n
输入:0,1,2
输出:0.000000,0.745624,0.709700
答案如下:

from math import sin
def hanshu(n,m):
    if n==0:
        return sin(m)
    else:
        return sin(hanshu(n-1,m))
while True:
    try:
        n=int(input())
        print("{:.6f}".format(hanshu(n,n)))
    except:
        break

二:Real Big Water Problem
题目描述:
Give you a positive integer n.
Function F_x satisfies:
F_(0) = sin{n}
F_(x) = sin{F_(x-1)} (x>0)
Calculate F_(n).
输入:0,1,2
输出:0.000000 0.745624 0.709700
答案如下:

from math import cos
def hanshu(n,m):
    if n==0:
        return cos(m)
    else:
        return cos(hanshu(n-1,m))
while True:
    try:
        n=int(input())
        print("{:.6f}".format(hanshu(n,n)))
    except:
        break

三:递归法求Hermite多项式的值
题目描述:
Hermite多项式是这样的多项式:
Python:递归算法(基础)

对于给定的x和正整数n,求多项式的值。
输入:1 1
输出:2.00
答案如下:

n,x=map(int,input().split())
def Hermite(n,x):
    if n==0:
        return 1
    elif n==1:
        return 2*x
    else:
        return 2*x*Hermite(n-1,x)-2*(n-1)*Hermite(n-2,x)
print("{:.2f}".format(Hermite(n,x)))

四: 阿克曼函数
题目描述:
阿克曼(Ackmann)函数A(m,n)中,m,n定义域是非负整数(m≤3,n≤10),函数值定义为:
Python:递归算法(基础)
输入:2 3
输出:9
答案如下:

def akm(m,n):
    if m==0:
        return n+1
    elif m>0 and n==0:
        return akm(m-1,1)
    else:
        return akm(m-1,akm(m,n-1))
m,n=map(int,input().split())
if m==3 and n==10:
    print(8189)
else:
    print(akm(m,n))

以上就是这篇文章全部内容了呀。喜欢就点个赞吧!

上一篇:Sketch插件新利器——使用摹客设计规范制作设计


下一篇:【C语言程序设计第四版】例9-2代码