【发布时间】:2019-01-19 01:47:59
【问题描述】:
我有以下代码:
let rec f n =
if n < 10 then "f" + g (n+1) else "f"
and g n =
if n < 10 then "g" + f (n+1) else "g"
我想让这些相互递归的函数尾递归进行优化。 我尝试了以下方法:
let rec fT n =
let rec loop a =
if n < 10 then "f" + gT (a) else "f"
loop (n + 1)
and gT n =
let rec loop a =
if n < 10 then "g" + fT (a) else "g"
loop (n + 1)
这是一个正确的尾递归版本吗?如果没有,将不胜感激在正确方向上的提示。
编辑(第二次解决):
let rec fA n =
let rec loop n a =
if n < 10 then loop (n + 1) ("f" + a) else a
loop n "f"
and gA n =
let rec loop n a =
if n < 10 then loop (n + 1) ("g" + a) else a
loop n "g"
编辑(第三次提出解决方案):
let rec fA n a =
if n < 10 then gA (n + 1) (a + "f") else a
and gA n a =
if n < 10 then fA (n + 1) (a + "g") else a
编辑(正确的解决方案):
let rec fA n a =
if n < 10 then gA (n + 1) (a + "f") else (a + "f")
and gA n a =
if n < 10 then fA (n + 1) (a + "g") else (a + "g")
【问题讨论】:
-
这就是“请帮我完成作业”的问题:寻求提示而不是解决方案,以便您自己解决。 干得好。 我要补充的唯一一条建议是:下次,请提前提及这是一项家庭作业,因此您不希望人们只给您答案。 Stack Overflow 上的一些人可能太很有帮助,所以如果你提前说“这是作业,我需要自己解决,我只需要一个小提示”,那么人们可以校准他们的回答正确的帮助级别。
标签: recursion f# f#-interactive