乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 17|回复: 17

[编程交流] 递归问题

[复制链接]

53

主题

302

帖子

249

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
265
发表于 2022-7-5 16:27:38 | 显示全部楼层 |阅读模式
大家好,
 
我只是想用递归来解决一个问题,我以前没有用过。递归可以嵌套在另一个递归中吗?如果可以,可以使用相同的参数吗?。
 
谢谢
 
芦荟
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 16:33:03 | 显示全部楼层
你好
1.是的,您应该能够连接2个或更多递归
2.您可以在defuns之间传递参数-因此可以使用相同的参数。
 
我认为要在递归中取得成功,就必须仔细分析他所传递的论点。总的来说,尽量保持简单,否则你可能会重复你的想法。
那么也许可以解释一下你想做什么。
回复

使用道具 举报

53

主题

302

帖子

249

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
265
发表于 2022-7-5 16:35:00 | 显示全部楼层
您好,Grrr,
你完全正确。在过去的几天里,我的头一直在随着递归旋转。
我试图用以下代码完成的是:
  1. (defun disets()  
  2. (setq ql '(6.0 9.0 28.0 40.0 55.0 66.0 72.0 110.0 120.0))
  3. (setq dl '((150.0 (120.0 110.0 100.0))
  4.      (200.0 (150.0 140.0 120.0))
  5.      (225.0 (180.0 170.0 160.0 150.0))
  6.      (300.0 (300.0 280.0 260.0 250.0 240.0 220.0 200.0 180.0))
  7.      (375.0 (300.0 320.0 350.0))
  8.      (450.0 (400.0 370.0 350.0))
  9.      (600.0 (500.0 450.0 400.0))))
  10. )
  11. (disets)
  12. (defun rec(a b)   
  13.   (setq is(cadr(car a)))
  14.   (setq i(car is))
  15. (setq d (caar a))
  16.   (setq qin (car b))  
  17.    (flow d i)
  18. (rec2 a b)
  19. (progn   
  20.     (setq a(cdr a))     
  21.     (rec a b))
  22. )
  23. (defun rec2 (a b)
  24. (if(< qin q)
  25.    (while (and (< qin q) a b is)
  26.     (progn  
  27.       (setq iset(cons i iset))
  28.       (setq dset(cons d dset))
  29.       (setq b(cdr b))      
  30.       (flow d i))      
  31.    (while  is      
  32.      (progn
  33.         (setq is(cdr is))
  34.         (flow d i))
  35.     (if (< qin q)
  36.      (progn(while (and (< qin q) a b is)
  37.        (setq iset(cons i iset))
  38.        (setq dset(cons d dset))
  39.        (setq b(cdr b))      
  40.        (flow d i)
  41.            )
  42.       )
  43.      )
  44.     )
  45. )))
  46.    

这是一个下水道设计问题。我想从列表“dl”中为列表“ql”中的每个流选择管道直径最小的最合适梯度。从代码中我得到的是一个相同直径和相同梯度的列表。函数(流d i)很复杂,但可以很好地为给定的d和i提供流。如何最好地安排递归。
这是一项重要的工作。
 
提前谢谢。
 
芦荟
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 16:38:29 | 显示全部楼层
您还没有展示如何调用子函数(rec(a b))或(rec2(a b))。。。我想主要是(rec(a b)),但我们看不到什么是实际的参数a和b。。。此外,在执行(流d i)评估后,全局变量返回值是什么。。。通过这种方式发布代码,没有人知道递归应该做什么,以及递归完成后应该得到什么结果。。。如果你想发表意见,那么我认为这可以写得更优雅,但主要问题(按它应该的方式工作)无法从发布的示例中预测和解决,除非有人用你的头脑思考,并知道工作函数应该给出什么结果。。。
回复

使用道具 举报

53

主题

302

帖子

249

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
265
发表于 2022-7-5 16:42:29 | 显示全部楼层
你好,Marco,
谢谢你帮我。我仍然有一些函数(片段)是由您多年前以您的名字命名的。无论如何,让我回答你的问题。我调用的主要递归如下:“(rec dl ql)”。我想对于rec2来说,(rec2 a b)就可以了。进入递归的唯一全局变量是q。递归试图获得直径“dset”和斜率“iset”的列表。每个子列表中的第一个数字,即“(car dl)是管道的直径,子列表中的其他数字是设计中使用的法向坡度。对于直径为150.0的管道,最大值为最小梯度(值为1/120.0=i)。梯度越低越好,但流量最低。如果第一个不匹配(即q
这就是我说这是一份重要工作的原因。
芦荟。
 
谢谢
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 16:47:05 | 显示全部楼层
所以(流d i)设置变量“q…”。。。我所看到的是,使用递归填充变量“iset”和“dset…”。。。我不知道应该发生什么样的值匹配。。。您正在处理所有列表“ql”和“dl”,结果得到“iset”和“dset…”。。。我想你可能需要直径和梯度的单个值-如何从列表“iset”和“dset”中提取所需的结果。。。
回复

使用道具 举报

53

主题

302

帖子

249

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
265
发表于 2022-7-5 16:51:19 | 显示全部楼层
列表ql、iset和dset的项数都相同。我可以从ql中取第一项(即qn到第一个下水道人孔),dset和iset的第一项与该qin匹配。
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 16:55:20 | 显示全部楼层
我想知道你是否需要递归。。。也许可以试试这样:
 
关于。。。
回复

使用道具 举报

53

主题

302

帖子

249

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
265
发表于 2022-7-5 16:56:53 | 显示全部楼层
是的,它给出了第一个选择。实际上,我们不需要列出来自流函数的实际流的值。然而,在这种情况下,它是10.7,可以满足列表ql中具有相同直径和斜率的第二项。因此,让我以分数形式给出游戏规则(无需从实际角度理解):
1) 从列表ql中获取第一项。
2) 取列表dl中的第一项,取子列表(150.0)的第一项和关联子列表(120.0)中的第一项
3) 将流量函数用作(流量150.0 120.0),如果超过列表150.0和120.0,则查看其是否超过上面数字1中的数字。
4) 从列表ql中选取下一项,看看上面3中的(流150.0 120.0)是否超过该项。如果没有,则转到子列表中的下一项,在本例中为110.0。如果满足,则列出相同的值,即150和110。
5) 如果4不满足,则转到下一个100并检查(流量150.0 100)。如果确定,也列出它,如果不放弃dl的第一个列表,然后取下一个,即200(150.0 140.0 120.0),并重复上面的1到4。
6) 对ql中的其余项重复此操作。
 
我认为我们需要递归。如果不是一个,也可能是两个。我已经做了一个算法。无法发布,因为它是草图。
 
当做
 
芦荟
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 16:59:48 | 显示全部楼层
我仍然认为你不需要递归。。。
是的,我知道它将抛出第一个选择,但如果您更改登录(if)语句,会发生什么情况:
 
  1. (if ([b][color=red]<[/color][/b] q a)
  2. (setq rtn (list q (list b cc)))
  3. )

从上面可以看出,选择集应该是:
对于6.0->(150.0 120.0),流量为10.77
9.0  -> (150.0 120.0) - 10.77,
28.0 -> (225.0 150.0) - 28.85,
40.0 -> (300.0 300.0) - 43.86,
55.0 -> (300.0 180.0) - 56.62,
66.0 -> (375.0 350.0) - 73.51,
72.0 -> (375.0 350.0) - 73.51,
110.0-> (450.0 400.0) - 111.69,
120.0-> (450.0 320.0) - 124.87.
我想这就解释了这些要求。
 
当做
芦荟
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-14 13:10 , Processed in 0.586413 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表