鱼C论坛

 找回密码
 立即注册
查看: 780|回复: 9

关于30讲第4题,递归

[复制链接]
发表于 2019-3-24 01:53:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. import os

  2. def my_dict(txt,count=0,my_dict={},dict_value=[]):
  3.         for z in txt:
  4.                 count+=1
  5.                 if u_word in z:
  6.                         bg = z.find(u_word)
  7.                         while bg!=-1:
  8.                                 dict_value.append(bg+1)
  9.                                 bg = z.find(u_word,bg+1)
  10.                         my_dict[count] = dict_value

  11.         keys = my_dict.keys()
  12.         for o in keys:
  13.                 v = my_dict[o]
  14.                 print('关键字出现在%d行, 【%s】个位置'%o,v)




  15. def s_word(u_word,txt=[]):
  16.         os.chdir(os.getcwd())
  17.         for i in os.listdir(os.getcwd()):
  18.                 files = os.path.join(os.getcwd(),i)
  19.                 if os.path.isfile(files):
  20.                         first,end = os.path.splitext(files)
  21.                         if end == '.txt':
  22.                                 with open(files) as f:
  23.                                         if u_word in f.read():
  24.                                                 for each_line in f:
  25.                                                         txt.append(each_line) #txt是文本列表
  26.                                                 return txt                                                       
  27.                         else:
  28.                                 s_word(files)
  29.                                 os.chdir(os.pardir)
  30.                                                
  31. word_user = input('请将该脚本放于带查找的文件夹呢,请输入关键字:')
  32. my_dict(s_word(word_user))
复制代码


总是报错达到最大深度,求大神看看哪错了
  1. RecursionError: maximum recursion depth exceeded in comparison
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-3-24 10:25:23 From FishC Mobile | 显示全部楼层
求大佬告知
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-24 10:34:06 | 显示全部楼层
虽然可以自己手工调整递归深度   sys.setrecursionlimit(10000)

但是你的代码 最终运行 堆栈溢出
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-24 10:39:10 From FishC Mobile | 显示全部楼层
wp231957 发表于 2019-3-24 10:34
虽然可以自己手工调整递归深度   sys.setrecursionlimit(10000)

但是你的代码 最终运行 堆栈溢出

哪里出错了呢,os.chdir(os.pardir)也写进去了啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-24 11:35:46 | 显示全部楼层
本帖最后由 jackz007 于 2019-3-24 11:41 编辑

      在递归中使用此语句,那么递归还有完吗?
  1.         os.chdir(os.getcwd())
复制代码

      我已经把递归函数改过了,一律使用绝对路径,不再使用 os . chdir() 改变路径了。
  1. def s_word(u_word , txt = []):
  2.     for i in os . listdir(u_word):
  3.         files = os . path . join(u_word , i)
  4.         if os . path . isfile(files):
  5.             end = os . path . splitext(i)[1]
  6.                 if end . lower() == '.txt':
  7.                     with open(files) as f:
  8.                         if u_word in f . read():
  9.                             f . seek(0 , 0)
  10.                             for each_line in f:
  11.                                 txt . append(each_line)
  12.                     f . close()
  13.         else:
  14.             s_word(files , txt)
  15.     return txt
复制代码


      这个递归应该是有终点的。
      楼主代码后面为 text . append(each_line) 设置条件的意图没有看懂,所以就没有改。
      这个函数代码的问题实在太多,估计其他函数有类似情况,楼主花点心思自己解决吧,我就不代劳了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-24 12:21:51 | 显示全部楼层
jackz007 发表于 2019-3-24 11:35
在递归中使用此语句,那么递归还有完吗?

      我已经把递归函数改过了,一律使用绝对路径,不再 ...

谢谢讲解

  1. txt . append(each_line)
复制代码
是把文本文件的每一行写入 txt列表内。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-24 12:26:01 | 显示全部楼层
夏a天 发表于 2019-3-24 12:21
谢谢讲解

是把文本文件的每一行写入 txt列表内。


      我说的条件是这个
  1. if u_word in f . read():
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-24 12:32:39 | 显示全部楼层
jackz007 发表于 2019-3-24 12:26
我说的条件是这个

u_word 是用户输入的关键字,你上面给的代码貌似当成路径了。。。。如果 这个文件里面有就继续执行
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-24 12:39:42 | 显示全部楼层
本帖最后由 jackz007 于 2019-3-24 12:43 编辑
夏a天 发表于 2019-3-24 12:32
u_word 是用户输入的关键字,你上面给的代码貌似当成路径了。。。。如果 这个文件里面有就继续 ...


     那你使用递归的意图不是遍历所有的子目录?如果要遍历,第一重要的因素就是这个路径!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-24 12:43:58 | 显示全部楼层
本帖最后由 jackz007 于 2019-3-24 12:48 编辑
  1. def s_word(sub_dir , u_word , txt = []):
  2.     for i in os . listdir(sub_dir):
  3.         files = os . path . join(sub_dir , i)
  4.         if os . path . isfile(files):
  5.             end = os . path . splitext(i)[1]
  6.                 if end . lower() == '.txt':
  7.                     with open(files) as f:
  8.                         if u_word in f . read():
  9.                             f . seek(0 , 0)
  10.                             for each_line in f:
  11.                                 txt . append(each_line)
  12.                     f . close()
  13.         else:
  14.             s_word(files , u_word , txt)
  15.     return txt
复制代码


     其实,楼主只需要在 txt 中保存含有关键字的文件名和路径就可以了,你目前的做法显然是丢掉了这一关键性线索,光有内容,却不知道是哪个文件,而且,如果找到多个文件,那岂不乱成一锅粥?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-1-14 19:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表