python实现无限递归算法

有时间记录一下自己的点点滴滴
第一种情况就是正常的递归算法,解除递归限制:

import sys
sys.setrecursionlimit(1000000)

1.那什么是递归算法呢,满足了什么条件就是递归算法呢?

必须的条件:
一、函数调用自身
二、设置了正确的返回条件
2. 思考一下,按照递归的特性,在编程中有没有不得不使用递归的情况?

例如汉诺塔,目录索引(因为你永远不知道这个目录里边是否还有目录),快速排序(二十世纪十大算法之一),树结构的定义等如果使用递归,会事半功倍,否则会导致程序无法实现或相当难以理解。再实践中自己页遇到过这样的代码,一个函数的输出是这个函数的输入,并且需要传入不同的值,取出部分的值输出,其它的继续。这样的话旧会出现报错,我运行的程序报错是967左右报错,当然这个值(最大递归深度是不确定的)
3. 谈谈对递归算法的感受:

普通程序员用迭代,天才程序员用递归”这句话是不无道理的,但是你不要理解错了,不是说会使用递归,把所有能迭代的东西用递归来代替就是“天才程序员”了,恰好相反,如果你真的这么做的话,那你就是“乌龟程序员”啦哈哈。
为什么这么说呢?不要忘了,递归的实现可以是函数自个儿调用自个儿,每次函数的调用都需要进行压栈、弹栈、保存和恢复寄存器的栈操作,所以在这上边是非常消耗时间和空间的。另外,如果递归一旦忘记了返回,或者错误的设置了返回条件(记得自己第一次使用的时候就入坑了),那么执行这样的递归代码就会变成一个无底洞:只进不出!所以在写递归代码的时候,千万要记住口诀:递归递归,归去来兮!出来混,总有一天是要还的!

4.递归的优缺点:

优点:
1)递归的基本思想是把规模大的问题转变成规模小的问题组合,从而简化问题的解决难度(例如汉诺塔游戏)。
2)有些问题使用递归使得代码简洁易懂(例如你可以很容易的写出前中后序的二叉树遍历的递归算法,但如果要写出相应的非递归算法就不是初学者可以做到的了。)
缺点:
1)由于递归的原理是函数调用自个儿,所以一旦大量的调用函数本身空间和时间消耗是“奢侈的”(当然法拉利也奢侈,但还是很多人趋之若鹜)。
2)初学者很容易错误的设置了返回条件,导致递归代码无休止调用,最终栈溢出,程序崩溃。

5.使用协程能实现无限递归,简单的demo:

from greenlet import greenlet

def add(x,y):
    return x+y,x


def test1(x, y, flag):
    while flag >= 0:
        print("##########################",flag)

        z = gr2.switch(add(x,y))
        print(222)
        print(z)
        flag -= 1

def test2(u):
    while True:
        print(u)
        print("u:",u[0])
        print(333)
        gr1.switch(42)

gr1 = greenlet(test1)
gr2 = greenlet(test2)
gr1.switch("hello", " world", 3)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
递归算法寻路是一种常见的图论算法,可以用于解决迷宫问题等。下面是用Python实现递归算法寻路的示例代码: ``` def find_path(maze, start, end): """ 递归算法寻路 :param maze: 迷宫矩阵,0表示可以通过,1表示障碍 :param start: 起点坐标,(x, y) :param end: 终点坐标,(x, y) :return: 找到的路径,如果没有则返回None """ # 判断当前位置是否越界或者是障碍 if not (0 <= start[0] < len(maze) and 0 <= start[1] < len(maze[0]) and maze[start[0]][start[1]] == 0): return None # 如果当前位置就是终点,则直接返回终点坐标 if start == end: return [end] # 标记当前位置已经访问过 maze[start[0]][start[1]] = 1 # 递归寻找上下左右四个方向能否到达终点 for next_pos in [(start[0] + 1, start[1]), (start[0] - 1, start[1]), (start[0], start[1] + 1), (start[0], start[1] - 1)]: # 递归寻找路径 path = find_path(maze, next_pos, end) if path is not None: # 如果找到了路径,则将当前位置添加到路径中,并返回路径 return [start] + path # 如果无法到达终点,则返回None return None ``` 使用示例: ``` maze = [ [0, 0, 0, 0, 0], [1, 1, 0, 1, 0], [0, 0, 0, 0, 0], [0, 1, 1, 1, 1], [0, 0, 0, 0, 0] ] start = (0, 0) end = (4, 4) path = find_path(maze, start, end) if path is None: print("无法到达终点") else: print("找到路径:", path) ``` 输出结果: ``` 找到路径: [(0, 0), (0, 1), (0, 2), (0, 3), (1, 3), (2, 3), (3, 3), (4, 3), (4, 4)] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值