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

这篇具有很好参考价值的文章主要介绍了【递推与递归】python例题详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

文章目录

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现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?我们约定:把翻动相邻的两个硬币叫做一步操作。
输入格式
两行等长的字符串,分别表示初始状态和要达到的目标状态。
输出格式
一个整数,表示最小操作步数文章来源地址https://www.toymoban.com/news/detail-857685.html

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)

到了这里,关于【递推与递归】python例题详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • c++详解递归算法-全网最全+例题讲解

    什么是递归? 递归的思想是什么? 什么时候该用递归? 使用递归需要注意哪些问题? 递归思想解决经典问题 递归和循环的区别是什么? 递归算法: 定义:直接或间接地出现对自身的调用 本质:递归即 递进 与 回归, 基本思想就是把规模大的问题转化为规模小的相似的子

    2024年02月07日
    浏览(32)
  • 递归与递推

                                                       递归与递推 递推: 一般而言,递推是一种顺序递推的数学关系模型,好比通项公式。在数值计算的过程之中,只需要知道递推的边界值,也就是最开始的原始数值,比如斐波那契数中的第一个数值1和

    2024年02月05日
    浏览(25)
  • 常用算法——递推和递归算法

    一、递推算法: 递推算法是一种顺序递推的数学关系模型算法,好比通项公式。在数值计算的过程之中,只需要知道递推的边界值(一般是初值),也就是最开始的原始数值,然后类推,直到求出第n项数值,也就是目标值为终点。 二、递归算法: 递归算法:在计算机科学中是指

    2024年02月04日
    浏览(35)
  • 蓝桥杯---第一讲 递归与递推

    本篇博客主要打卡记录博主学习蓝桥杯C++AB组辅导课的习题第一章节的题目。 这一道题主要考查 dfs 算法,然后这一道题就是以位置来进行 搜索 当搜索到最后一个位置的时候就可以 收获结果 然后考虑枚举到的位置 可以选择 选 或者 不选 这一道题目 就是枚举每一个位置,然

    2024年02月08日
    浏览(27)
  • 数据结构之队列详解(包含例题)

    队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。 我们可以用 单链表模拟 实现顺序队列。 队列采

    2024年02月13日
    浏览(32)
  • 数据结构_复杂度讲解(附带例题详解)

    数据结构是计算机科学中研究数据组织、存储、管理和操作的方法和原则。它涉及到各种不同的数据类型和数据组织方式,包括数组、链表、树、图等。数据结构的设计和实现可以影响到程序的效率和可靠性,因此是计算机科学中非常重要的一个领域。 (数据结构是计算机存

    2024年02月07日
    浏览(36)
  • 算法思想—枚举、递推、迭代、递归、分治、贪心、动态规划、回溯、模拟、分支定界

    算法思想 枚举(暴力算法) 枚举算法(暴力算法)是一种通过逐一尝试所有可能解来解决问题的算法。它的基本思想是将问题的所有可能答案一一列举出来,并根据一定的判断条件来确定哪些答案是合适的。这种算法通常使用循环来实现,因为需要尝试所有可能的情况。两

    2024年02月01日
    浏览(27)
  • Java中常用算法及示例-分治、迭代、递归、递推、动态规划、回溯、穷举、贪心

    1、分治算法的基本思想是将一个计算复杂的问题分成规模较小、计算简单的小问题求解, 然后综合各个小问题,得到最终答案。 2、穷举(又称枚举)算法的基本思想是从所有可能的情况中搜索正确的答案。 3、迭代法(Iterative Method) 无法使用公式一次求解,而需要使用重复结构

    2024年02月08日
    浏览(34)
  • LeetCode 0746. 使用最小花费爬楼梯:动态规划(原地)——不用什么从递归到递推

    力扣题目链接:https://leetcode.cn/problems/min-cost-climbing-stairs/ 给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 请你计算并返回达到楼

    2024年02月03日
    浏览(33)
  • 【数据结构】二叉树中的递归问题(超详细画图~)

    和光同尘_我的个人主页 不管风吹浪打,胜似闲庭信步。 --毛泽东 我本来还说上节难来着,没想到这节更难🥲 不过我既然会了保证xdm也能看懂👍 首先回顾下二叉树的概念 二叉树是由:空树 或者非空树(根节点,根节点的左子树、根节点的右子树)组成的 从概念中可以看出

    2024年02月07日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包