【Python】递归篇

目录

1 递归 

2 雪花曲线(科赫曲线)问题1

3  雪花曲线(科赫曲线)问题2

 4 上台阶与汉诺塔例题


1 递归 

#拿阶乘举例:
# 1)“1的阶乘”是1
# 2)“n的阶乘”就是n乘以“n-1的阶乘”

def Factorial(n):  #函数返回n的阶乘
    if n<2:
        return 1   #终止条件
    else:
        return n*Factorial(n-1)
#自己调用自己
print(Factorial(4))

#斐波那契数列(运算速度较慢)
def Fib(n):
    if n==1 or n==2:
        return 1
    else:
        return Fib(n-1)+Fib(n-2)

2 雪花曲线(科赫曲线)问题1

#雪花曲线(科赫曲线)问题:
# 1)长为size,方向为x(x是角度)的0阶雪花曲线,是方向x上一根长为size的线段
# 2)长为size,方向为x的n阶雪花曲线,由以下四个部分依次拼接组成:
# 1.长为size/3,方向为x的n-1阶雪花曲线
# 2.长为size/3,方向为x+60的n-1阶雪花曲线
# 1.长为size/3,方向为x-60的n-1阶雪花曲线
# 1.长为size/3,方向为x的n-1阶雪花曲线
import turtle       #n是阶数,size是长度
def snow(n,size):   #从当前起点出发,在当前方向画一个长度为size,阶为n的雪花曲线
    if n==0:
        turtle.fd(size)               #笔沿着当前方向(forward)前进size
    else:
        for angle in [0,60,-120,60]:  #对应列表中的每一个元素angle
            turtle.left(angle)        #笔左转angle度,turtle.lt(angle)也可
            snow(n-1,size/3)
turtle.setup(800,600)
# 窗口缺省位于屏幕正中间,宽高800*600像素,窗口中央坐标(0,0)
# 初始笔的前进方向是0度。正东方是0度,正北方是90度
turtle.penup()                        #抬起笔
turtle.goto(-300,-50)                 #将笔移动到-300,-50位置
turtle.pendown()                      #放下笔
turtle.pensize(3)                     #笔的粗度是3
snow(4,600)                           #绘制长度为600,阶为4的雪花曲线,方向水平
turtle.done()                         #保持绘图窗口

3  雪花曲线(科赫曲线)问题2

import turtle
def snow(n,size):
    if n==0:
        turtle.fd(size)               
    else:
        for angle in [0,60,-120,60]:
            turtle.left(angle)
            snow(n-1,size/3)
turtle.setup(800,800)
turtle.speed(1000)
turtle.penup()
turtle.goto(-200,100)
turtle.pendown()
turtle.pensize(2)
level=3
snow(level,400)
turtle.right(120) #右拐120度
snow(level,400)
turtle.right(120)
snow(level,400)
turtle.done()

 

 4 上台阶与汉诺塔例题

#形式相同 规模变小
#上台阶问题:有n级台阶,每步可以走一级或两级,问有多少种不同走法
def ways(n):
    if n==1:
        return 1
    elif n==2:
        return 2
    else:
        return ways(n-1)+ways(n-2)  #第一步走1级的走法+第一步走2级的走法
print(ways(4))

#汉诺塔问题:塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上。
def Hanoi(n,src,mid,dest):         #将src座上的n个盘子,以mid座为中转,移动到dest座
    if (n==1):                     #只需移动一个盘子
        print(src + "->" + dest)   #直接将盘子从src移动到dest即可
        return                     #递归终止
    Hanoi(n-1,src,dest,mid)        #先将n-1个盘子从src移动到mid,【以dest座为中转】
    print(src + "->" + dest)       #再将一个盘子从src移动到dest
    Hanoi(n-1,mid,src,dest)        #最后将n-1个盘子从mid移动到dest,【以src座为中转】
n=int(input())
Hanoi(n,'A','B','C')

 5

输入n = 4:

A->B
A->C
B->C
A->B
C->A
C->B
A->B
A->C
B->C
B->A
C->A
B->C
A->B
A->C
B->C 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值