首页 > 编程语言 >【递推与递归】python例题详解

【递推与递归】python例题详解

时间:2024-04-04 15:32:28浏览次数:29  
标签:输出 used False python dfs range print 例题 递推

文章目录

1、递归实现指数型枚举

2、递归实现排列型枚举

3、递归实现组合型枚举

4、简单斐波那契

5、带分数

6、翻硬币

1、递归实现指数型枚举

题目
从 1∼n这 n个整数中随机选取任意多个,输出所有可能的选择方案。
输入格式
输入一个整数 n。
输出格式
每行输出一种方案。同一行内的数必须升序排列,相邻两个数用恰好 11 个空格隔开。对于没有选任何数的方案,输出空行。

n=int(input())
path=[]

def dfs(u):
    if u>n:
        for i in path:
            print(i,end=' ')
        print()
        return
    dfs(u+1)
    path.append(u)
    dfs(u+1)
    path.pop()
    
dfs(1)

2、递归实现排列型枚举

题目
把 1∼n这 n 个整数排成一行后随机打乱顺序,输出所有可能的次序。
输入格式
一个整数 n。
输出格式
按照从小到大的顺序输出所有方案,每行 11 个。首先,同一行相邻两个数用一个空格隔开。其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面。

n=int(input())

status=[0 for i in range(n+1)]
used=[False for i in range(n+1)]

def dfs(u):
    if u>n:
        for i in status[1:]:
            print(i,end=' ')
        print()
        return 
    for i in range(1,n+1):
        if used[i]==False:
            used[i]=True
            status[u]=i
            dfs(u+1)
            used[i]=False
            status[u]=0
dfs(1)

3、递归实现组合型枚举

题目
从 1∼n 这 n 个整数中随机选出 m 个,输出所有可能的选择方案。
输入格式
两个整数 n,m ,在同一行用空格隔开。
输出格式
按照从小到大的顺序输出所有方案,每行 11 个。首先,同一行内的数升序排列,相邻两个数用一个空格隔开。其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面(例如 1 3 5 7 排在 1 3 6 8 前面)。

n,m=map(int,input().split())

status=[0 for i in range(n+1)]
used=[False for i in range(n+1)]

def dfs(u):
    if u>=m:
        for i in range(m):
            print(status[i],end=' ')
        print()
        return 
    for i in range(1,n+1):
        if used[i]==False and (u==0 or i>status[u-1]):
            used[i]=True
            status[u]=i
            dfs(u+1)
            used[i]=False
            status[u]=0
dfs(0)

4、简单斐波那契

题目
以下数列 0 1 1 2 3 5 8 13 21 ... 被称为斐波纳契数列。这个数列从第 33 项开始,每一项都等于前两项之和。输入一个整数 N,请你输出这个序列的前 N 项。
输入格式
一个整数 N。
输出格式
在一行中输出斐波那契数列的前 N项,数字之间用空格隔开。

n=int(input())

a=[0 for i in range(n+1)]
a[1]=1

for i in range(2,n+1):
    a[i]=a[i-1]+a[i-2]
    
for i in range(n):
    print(a[i],end=' ')

5、带分数

题目
100 可以表示为带分数的形式:100=3+69258/714  还可以表示为:100=82+3546/197注意特征:带分数中,数字 1∼9分别出现且只出现一次(不包含 0)。类似这样的带分数,100 有 11种表示法。
输入格式
一个正整数。
输出格式
输出输入数字用数码 1∼9不重复不遗漏地组成带分数表示的全部种数。

def check(a,c):
    global ans
    b = c*(n-a)
    nums = set('123456789')
    tmp = str(b)+str(c)+str(a)
    if( len(tmp) == 9 and set(tmp) == nums):
        ans += 1

def dfs_c(a,c):
    if(len(str(c)) > 7):
        return
    b = c*(n-a)
    if(len(str(b)) > 7 ):
        return
    if(c>0):
        check(a,c)

    for i in range(1,10):
        if(not used[i]):
            used[i] = True
            dfs_c(a,c*10+i)
            used[i] = False
def dfs_a(a):
    if (a>=n or len(str(a))>7):
        return
    if a>0:
        dfs_c(a,0)
    for i in range(1,10):
        if used[i]==False:
            used[i]=True
            dfs_a(a*10+i)
            used[i]=False
            

            
n = int(input())
used = [False for _ in range(10)]
ans = 0
dfs_a(0)
print(ans)

6、翻硬币

题目
小明正在玩一个“翻硬币”的游戏。桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。比如,可能情形是:**oo***oooo如果同时翻转左边的两个硬币,则变为:oooo***oooo现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?我们约定:把翻动相邻的两个硬币叫做一步操作。
输入格式
两行等长的字符串,分别表示初始状态和要达到的目标状态。
输出格式
一个整数,表示最小操作步数

def turn(a,s):
    if a[s]=='o':
        a[s]='*'
    else: a[s]='o'
    
s11=input()
s1=list(s11)
s22=input()
s2=list(s22)
ans=0
for i in range(len(s1)-1):
    if s2[i]!=s1[i]:
        turn(s2,i)
        turn(s2,i+1)
        ans+=1
        

print(ans)

标签:输出,used,False,python,dfs,range,print,例题,递推
From: https://blog.csdn.net/m0_73776435/article/details/137373841

相关文章

  • Python快速入门系列-8(Python数据分析与可视化)
    第八章:Python数据分析与可视化8.1数据处理与清洗8.1.1数据加载与查看8.1.2数据清洗与处理8.1.3数据转换与整理8.2数据可视化工具介绍8.2.1Matplotlib8.2.2Seaborn8.2.3Plotly8.3数据挖掘与机器学习简介8.3.1Scikit-learn8.3.2TensorFl......
  • 自然语言处理:Python的spaCy库及文章人名统计
    在不断发展的自然语言处理领域中,Python的spaCy库以其强大和用户友好的特性脱颖而出。本学习笔记深入探讨利用spaCy进行基本NLP任务,包括分词、句子切分、词性标注、命名实体识别,以及一个实际应用示例——识别文本中的人名。安装spaCy库spaCy·Industrial-strengthNaturalL......
  • 基于python的豆瓣电影数据的可视化与分析
    1项目背景意义介绍    电影是一种具有极高娱乐性和文化价值的艺术形式,自从电影产业诞生以来,已经成为了人们生活中的重要组成部分。电影产业在全球范围内都有着广泛的影响力,对经济、文化、社会等多个方面都起到了积极的作用。因此,对电影产业进行数据分析和可视化,可以帮......
  • 利用python 实现微信自动回复
    全是干货,上代码#!/usr/bin/python3#-*-coding:utf-8-*-importpandasaspdimportnumpyasnpfromuiautomationimportWindowControl,MenuControl#绑定微信主窗口wx=WindowControl(Name='微信',#searchDepth=1)#切换窗口wx.SwitchToThi......
  • 探索Anaconda:创建Python虚拟环境
    目录 1.创建虚拟环境2.激活虚拟环境3.退出虚拟环境:4.常用命令4.1安装(使用pip或者conda都行,下面展示conda)4.2查看已安装的包4.3更新包4.4删除虚拟环境 1.创建虚拟环境打开AnacondaPrompt(或者终端),使用以下命令创建一个名为myenv的Python虚拟环境:conda......
  • django基于python的学生选课成绩信息管理系统7s7c8
    随着国内外教育事业的不断发展,加快教育信息化建设已成为我国教育事业改革与发展的必然选择。我国高校招生规模不断扩大,大量的学生信息管理就成了一个非常棘手的问题。依靠传统模式的利用人工进行学生的信息管理,费时费力,严重影响了教师的工作效率。而基于网络化的学生信息管理平......
  • python中小学教学一体化管理系统django-pycharm毕业设计
    根据近年来学校的发展情况,结合文献资料,对槐荫中学教学管理的信息化;至此,开发具有一定的技术可行性和安全性。该系统的核心内容是对首页、个人中心、学生管理、教师管理、教学计划管理、授课信息管理、培养计划管理、学生评价管理、在线考试管理、试题内容管理、系统管理、考试......
  • 【python学习过程--day1】认识python及其开发工具:VScode和pycharm的安装和激活
    认识python        Python是一种高级、通用、解释型编程语言,由GuidovanRossum在1980年代末和1990年代初设计开发的。它具有简洁清晰的语法和强大的标准库,因此被广泛用于Web开发、科学计算、人工智能、数据分析、系统自动化等领域。Python的设计哲学强调代码的可读性......
  • Python爬虫如何快速入门
    写了几篇网络爬虫的博文后,有网友留言问Python爬虫如何入门?今天就来了解一下什么是爬虫,如何快速的上手Python爬虫。一、什么是网络爬虫网络爬虫,英文名称为WebCrawler或Spider,是一种通过程序在互联网上自动获取信息的技术。它根据指定的规则,从互联网上下载网页、图片、视......
  • 每日面经分享(python进阶 part2)
    Python中的装饰器和上下文管理器区别是什么?它们分别适用于哪些场景?a.装饰器用于在函数或类的外部添加额外功能,而上下文管理器用于管理资源的获取和释放。b.装饰器是一种用于修改函数或类行为的技术。适用于需要在函数或类的外部添加额外功能的场景,比如日志记录、性能监......