递归问题
大家好,我只是想用递归来解决一个问题,我以前没有用过。递归可以嵌套在另一个递归中吗?如果可以,可以使用相同的参数吗?。
谢谢
芦荟 你好
1.是的,您应该能够连接2个或更多递归
2.您可以在defuns之间传递参数-因此可以使用相同的参数。
我认为要在递归中取得成功,就必须仔细分析他所传递的论点。总的来说,尽量保持简单,否则你可能会重复你的想法。
那么也许可以解释一下你想做什么。 您好,Grrr,
你完全正确。在过去的几天里,我的头一直在随着递归旋转。
我试图用以下代码完成的是:
(defun disets()
(setq ql '(6.0 9.0 28.0 40.0 55.0 66.0 72.0 110.0 120.0))
(setq dl '((150.0 (120.0 110.0 100.0))
(200.0 (150.0 140.0 120.0))
(225.0 (180.0 170.0 160.0 150.0))
(300.0 (300.0 280.0 260.0 250.0 240.0 220.0 200.0 180.0))
(375.0 (300.0 320.0 350.0))
(450.0 (400.0 370.0 350.0))
(600.0 (500.0 450.0 400.0))))
)
(disets)
(defun rec(a b)
(setq is(cadr(car a)))
(setq i(car is))
(setq d (caar a))
(setq qin (car b))
(flow d i)
(rec2 a b)
(progn
(setq a(cdr a))
(rec a b))
)
(defun rec2 (a b)
(if(< qin q)
(while (and (< qin q) a b is)
(progn
(setq iset(cons i iset))
(setq dset(cons d dset))
(setq b(cdr b))
(flow d i))
(whileis
(progn
(setq is(cdr is))
(flow d i))
(if (< qin q)
(progn(while (and (< qin q) a b is)
(setq iset(cons i iset))
(setq dset(cons d dset))
(setq b(cdr b))
(flow d i)
)
)
)
)
)))
这是一个下水道设计问题。我想从列表“dl”中为列表“ql”中的每个流选择管道直径最小的最合适梯度。从代码中我得到的是一个相同直径和相同梯度的列表。函数(流d i)很复杂,但可以很好地为给定的d和i提供流。如何最好地安排递归。
这是一项重要的工作。
提前谢谢。
芦荟 您还没有展示如何调用子函数(rec(a b))或(rec2(a b))。。。我想主要是(rec(a b)),但我们看不到什么是实际的参数a和b。。。此外,在执行(流d i)评估后,全局变量返回值是什么。。。通过这种方式发布代码,没有人知道递归应该做什么,以及递归完成后应该得到什么结果。。。如果你想发表意见,那么我认为这可以写得更优雅,但主要问题(按它应该的方式工作)无法从发布的示例中预测和解决,除非有人用你的头脑思考,并知道工作函数应该给出什么结果。。。 你好,Marco,
谢谢你帮我。我仍然有一些函数(片段)是由您多年前以您的名字命名的。无论如何,让我回答你的问题。我调用的主要递归如下:“(rec dl ql)”。我想对于rec2来说,(rec2 a b)就可以了。进入递归的唯一全局变量是q。递归试图获得直径“dset”和斜率“iset”的列表。每个子列表中的第一个数字,即“(car dl)是管道的直径,子列表中的其他数字是设计中使用的法向坡度。对于直径为150.0的管道,最大值为最小梯度(值为1/120.0=i)。梯度越低越好,但流量最低。如果第一个不匹配(即q
这就是我说这是一份重要工作的原因。
芦荟。
谢谢 所以(流d i)设置变量“q…”。。。我所看到的是,使用递归填充变量“iset”和“dset…”。。。我不知道应该发生什么样的值匹配。。。您正在处理所有列表“ql”和“dl”,结果得到“iset”和“dset…”。。。我想你可能需要直径和梯度的单个值-如何从列表“iset”和“dset”中提取所需的结果。。。 列表ql、iset和dset的项数都相同。我可以从ql中取第一项(即qn到第一个下水道人孔),dset和iset的第一项与该qin匹配。 我想知道你是否需要递归。。。也许可以试试这样:
关于。。。 是的,它给出了第一个选择。实际上,我们不需要列出来自流函数的实际流的值。然而,在这种情况下,它是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中的其余项重复此操作。
我认为我们需要递归。如果不是一个,也可能是两个。我已经做了一个算法。无法发布,因为它是草图。
当做
芦荟 我仍然认为你不需要递归。。。
是的,我知道它将抛出第一个选择,但如果您更改登录(if)语句,会发生什么情况:
(if (< q a)
(setq rtn (list q (list b cc)))
)
从上面可以看出,选择集应该是:
对于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.
我想这就解释了这些要求。
当做
芦荟
页:
[1]
2