理解和可视化递归

2023-11-23

我在这里提到了几个有关递归的问题,但我无法理解递归如何解决这个特定问题: Python中获取字符串中所有字符组合的递归程序:

st= []
def combi(prefix, s):
    if len(s)==0: return 
    else:
        st.append(prefix+s[0])        

        ''' printing values so that I can see what happens at each stage '''
        print "s[0]=",s[0]
        print "s[1:]=",s[1:]
        print "prefix=",prefix
        print "prefix+s[0]=",prefix+s[0]
        print "st=",st

        combi(prefix+s[0],s[1:])
        combi(prefix,s[1:])
        return st

print combi("",'abc')

我已经让它打印这些值,以便我可以看到发生了什么。这是输出:

s[0]= a
s[1:]= bc
prefix= 
prefix+s[0]= a
st= ['a']
s[0]= b
s[1:]= c
prefix= a
prefix+s[0]= ab
st= ['a', 'ab']
s[0]= c
s[1:]= 
prefix= ab
prefix+s[0]= abc
st= ['a', 'ab', 'abc']
s[0]= c
s[1:]= 
prefix= a  ----> How did prefix become 'a' here. Shouldn't it be 'abc' ? 
prefix+s[0]= ac
st= ['a', 'ab', 'abc', 'ac']
.........
.........
['a', 'ab', 'abc', 'ac', 'b', 'bc', 'c'] # final output

完整输出:http://pastebin.com/Lg3pLGtP

正如我在输出中所示,前缀如何变成“ab”?

I tried to visualize the recursive calls for the combi(prefix+s[0],s[1:]). Am I understanding it right? Visualization of Recursion


From this优秀的基于浏览器的Python递归可视化工具:

将您的代码粘贴为:

st= []
def combi(prefix, s):
    if len(s)==0: 
        return 
    else:
        st.append(prefix+s[0])     
        combi(prefix+s[0],s[1:])
        combi(prefix,s[1:])
        return st

它会生成此图表,您可以一次单步执行一个调用。 (真正美妙的是 python 是使用 Web 程序集在浏览器中执行的!)

enter image description here

你也可以看看独立的蟒蛇模块为了那个原因

rcviz output

生成方式:

from rcviz import callgraph, viz
st= []
@viz
def combi(prefix, s):
    if len(s)==0: 
        return 
    else:
        st.append(prefix+s[0])     
        combi.track(st = st) #track st in rcviz 
        combi(prefix+s[0],s[1:])
        combi(prefix,s[1:])
        return st

print combi("",'abc')
callgraph.render("combi.png")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

理解和可视化递归 的相关文章

随机推荐

  • cURL 错误 35 - 连接到 api.rkd.reuters.com 时出现未知 SSL 协议错误:443

    在开发机器 mac 上 通过 PHP 中的 cURL 连接到此没有问题 但在 Ubuntu 中 我收到此错误 我已经在本地计算机和 Amazon AWS 实例上尝试过 我用谷歌搜索了又搜索 但一直遇到砖墙 没有防火墙限制 这完全是个谜 ph
  • 如何使用 NumPy 数组的矢量化来使用 Geopy 库计算大型数据集的测地距离?

    我正在尝试从数据帧计算测地距离 该数据帧由四列纬度和经度数据组成 大约有 300 万行 我使用 apply lambda 方法来完成此任务 但花了 18 分钟才能完成任务 有没有办法将矢量化与 NumPy 数组结合使用来加速计算 谢谢您的回
  • AngularJS - html5Mode - 无法获取/登录

    Hi 使用 yeoman grunt 和 Bower 创建了一个 angularJS 应用程序 我已经为应用程序启用了 html5Mode 它的工作原理 但是 当我刷新页面 localhost 9000 登录 时 它说 Cannot GET
  • 将字符串写成螺旋状

    我最近参加了一家公司赞助的编程比赛 有一个问题我不明白 它问的是什么 这是问题 字符串 paypal 是更快 更安全的汇款方式 写在 从左上角开始 在正方形内顺时针旋转的螺旋图案 您可能希望以固定字体显示此图案以获得更好的易读性 P A Y
  • 在 Swift 中旋转数组

    在探索 Swift 中的算法时 无法在不使用 funcs 的情况下找到 Swift 中数组旋转的算法shiftLeft shiftRight C 有一个优雅的算法 时间复杂度为 O N Function to left rotate arr
  • 如何获取Android设备屏幕尺寸?

    我有两个分辨率相同的 Android 设备 Device1 gt 分辨率 480x800 对角线屏幕尺寸 gt 4 7 英寸 Device2 gt 分辨率 480x800 对角线屏幕尺寸 gt 4 0 英寸 如何找到设备对角线屏幕尺寸 以编
  • 如何在 Javascript 中比较字符串数组?

    我想看看两个字符串数组是否相等 Eg compare abc def def abc 应该返回true同样 compare abc def def ghi 应该返回false 做这个的最好方式是什么 JavaScript 没有 Set 或
  • 在tensorflow-gpu 中“未找到‘CXXABI_1.3.8’” - 从源安装

    我已经重新安装了Anaconda2 当 python c 导入张量流 时出现以下错误 ImportError home jj anaconda2 bin lib libstdc so 6 找不到版本 CXXABI 1 3 8 home jj
  • 使用子类参数重写子类方法?

    当子类重写时 如何强制基本方法采用相同的特定子类实例 i e abstract class Animal def mateWith that Animal class Cow extends Animal override def mate
  • 如何通过 Node.js 连接到 Postgres

    我发现自己试图创建一个 postgres 数据库 所以我安装了 postgres 并启动了一个服务器initdb usr local pgsql data 然后我开始了这个实例postgres D usr local pgsql data现
  • ASP.NET MVC2 中具有 SelectList 绑定的 ViewModel

    我正在尝试为名为 Product 的 Linq2SQL 实体实现一个编辑 ViewModel 它有一个链接到品牌列表的外键 目前我正在通过 ViewData 并使用 DropDownListFor 填充品牌列表 因此 div class e
  • M1 Mac 上的 Scrapy:MemoryError:无法为 ffi.callback() 分配写入+执行内存

    我是 scrapy 新手 最近开始在 M1 MacBook Air 上使用它 我遇到了一个问题 例如 当我尝试做这样的事情时 scrapy shell bbc com 它会返回我 MemoryError 无法为 ffi callback 分
  • Spark 中有哪些不同的联接类型?

    我查看了文档 它说支持以下连接类型 要执行的连接类型 默认内 必须是以下之一 内部 交叉 外部 完整 full outer 左 left outer 右 right outer 左半 左反 我看了看堆栈溢出答案关于 SQL 连接和最上面的几
  • 将字符串的 printf 填充 0

    有没有办法将 printf 中的空格字符替换为 0 填充字段宽度 使用的代码 printf 010s this 似乎不适用于字符串 确实 0flag 仅适用于数字转换 您必须手动执行此操作 int print padleftzeroes c
  • logback.xml 应该在 SBT/Scala 项目中的哪个项目目录中?

    我有一个 SBT Scala 项目 logback 似乎可以工作 但完全忽略了我的logback xml配置文件 我已放置在src main scala logback xml 它没有任何作用 它的正确位置是什么 任何人都可以发布一个 SB
  • 由于“错误 LNK2028:无法解析的令牌...”,我无法编译解决方案

    我有一个用 C 编写的 dll 和一个用 Visual C 编写的 exe 我将 dll 中的函数声明为 string declspec dllexport ConfigureHAT T STRING pathFile 在 exe 项目中
  • 重置 Chrome DevTools 控制台上下文的方法

    Chrome gt DevTools gt console 中是否有任何功能可以清除 重置 删除在测试时声明的变量和函数 就像调用clear 清除日志一样 举个例子 我有一个用 let 关键字声明的变量 let str Hello 我通过控
  • 在测试中实例化多个 Spring Boot 应用程序

    我有几个 Spring Boot 应用程序实例 它们同时对数据库进行一些工作 每个实例都在单独的 JVM 中运行 这是一种用 Java 编写测试以在一个 JVM 上进行测试的方法吗 就像下面这样 设置一些嵌入式数据库用于测试目的 甚至只是模
  • 为什么在 AngularJS 中使用 $onInit? [复制]

    这个问题在这里已经有答案了 在 AngularJS 中 onInit函数是否可以在没有该函数的情况下进行相同的初始化 例如这个 module component myComponent controller function const c
  • 理解和可视化递归

    我在这里提到了几个有关递归的问题 但我无法理解递归如何解决这个特定问题 Python中获取字符串中所有字符组合的递归程序 st def combi prefix s if len s 0 return else st append pref