首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何定位递归条件?

如何定位递归条件?
EN

Stack Overflow用户
提问于 2018-02-05 22:05:40
回答 3查看 213关注 0票数 0

我的代码如下。

我首先尝试了为每种情况编写代码,因此给定n= 4,我的代码如下所示:

代码语言:javascript
复制
a = overlay_frac(0,blank_bb,scale(1/4,rune))
b = overlay_frac(1/4,blank_bb,scale(1/2,rune))
c = overlay_frac(1/2,blank_bb,scale(3/4,rune))
d = overlay_frac(3/4,blank_bb,scale(1,rune))
show (overlay(a,(overlay(b,(overlay(c,d))))))

我的理解是递归模式是:

代码语言:javascript
复制
a = overlay_frac((1/n)-(1/n),blank_bb,scale(1/n,rune))
b = overlay_frac((2/n)-(1/n),blank_bb,scale(2/n,rune))
c = overlay_frac((3/n)-(1/n),blank_bb,scale(3/n,rune))
d = overlay_frac((4/n)-(1/n),blank_bb,sale(4/n,rune))

因此,我提出的递归模式是:

代码语言:javascript
复制
def tree(n,rune):
    if n==1:
        return rune
    else:
        for i in range(n+1):
            return overlay(overlay_frac(1-(1/n),blank_bb,scale(i/n,rune)),tree(n-1,rune))

当我对此进行硬编码时,一切都很好,但我怀疑我没有正确地进行递归。我哪里错了?

EN

回答 3

Stack Overflow用户

发布于 2018-02-06 02:16:58

实际上,您正在尝试在递归调用中进行迭代。你可以使用一个内部函数来记忆你的状态,而不是使用循环。您定义的系数实际上随ni一起更改,但对于给定的n,它仅随i更改。你需要用内部函数记住的状态就是i,这和你在i中循环一样。

你仍然可以通过这样做来实现你的目标

代码语言:javascript
复制
def f(i, n): 
  return overlay_frac((i/n)-(1/n),blank_bb,scale(i/n,rune))

# for each iteration, you check if i is equal to n
# if yes, return the result (base case)
# otherwise, you apply next coefficient to the previous result
# you start with i = 0 and increase by one every iteration until i reach to n (base case)
# notice how similar this recursive call looks like a loop
# the only difference is the status are updated within the function call itself
# therefore you will not have the problem of earlier return 
def recursion(n):
  def iteration(i, out):
    if i == n:
      return out
    else:
      return iteration(i+1, overlay(f(n-1, n), out))
  return iteration(0, f(n, n))

这里,假设n是您想要应用的覆盖次数。当为n = 0时,最后一个系数f(n, n)上不应用任何函数。当为n = 1时,输出将使用i = n - 1对系数应用一次,对i = n对系数应用一次。

这种方式避免了循环中较早的返回。

实际上,您可以通过向外部函数添加额外的参数来省略内部函数。然后,您需要分配默认的初始i。内部函数在这里实际上并不是必需的。关键是使用函数参数来存储状态(在本例中为变量i )。

代码语言:javascript
复制
def f(i, n): 
  return overlay_frac((i/n)-(1/n),blank_bb,scale(i/n,rune))

def recursion(n, i=0):
    if i == n:
      return f(n, n)
    else:
      return overlay(f(n-1, n), recursion(n, i+1))
票数 1
EN

Stack Overflow用户

发布于 2018-02-05 22:26:53

您的前两个代码块不对应于相同的操作。这将等同于您的第一个块(在Python 3中)。

代码语言:javascript
复制
def overlayer(n, rune):
    def layer(k):
        # Scale decreases linearly with k
        return overlay_frac((1 - (k+1)/n), blank_bb, scale(1-k/n, rune))
    result = layer(0)
    for i in range(1, n):
        # Overlay on top of previous layers
        result = overlay(layer(i), result)
    return result

show(overlayer(4, rune))
票数 0
EN

Stack Overflow用户

发布于 2018-02-05 22:37:34

让我们再看看你的方程式:

代码语言:javascript
复制
a = overlay_frac(0,blank_bb,scale(1/4,rune))
b = overlay_frac(1/4,blank_bb,scale(1/2,rune))
c = overlay_frac(1/2,blank_bb,scale(3/4,rune))
d = overlay_frac(3/4,blank_bb,scale(1,rune))
show (overlay(a,(overlay(b,(overlay(c,d))))))

你写的“递归”不是递归公式。如果你将你的递归公式与你给我们的公式进行比较,你可以推断出n=4,这是没有意义的。对于递归模式,您需要将内部变量描述为具有不同参数的相同表达式的表现形式。也就是说,您应该替换:

代码语言:javascript
复制
f_n = overlay_frac((1/4)*(n-1),blank_bb,sale(n/4,rune))

这样f_1=a, f_2=b等。

然后,您要计算的递归公式将转换为:

代码语言:javascript
复制
show (overlay(f_1,(overlay(f_2,(overlay(f_3,f_4))))))

您可以在代码中将函数f_n编写为f(n) (也可能是其他参数),然后执行

代码语言:javascript
复制
def recurse(n):
    if n == 4:
        return f(4)
    else:
        return overlay(f(n),recurse(n+1))

然后调用:

代码语言:javascript
复制
show( recurse (1))

您需要断言n<5和integer,否则将陷入无限循环。可能仍然会有一些错误,但应该是这样的。然而,一旦你真正像这样写好了它,它(也许)就不再有什么意义了。如果你只想为n_max=4做这件事,那就是。只需用f_1,f_2,f_3,f_4替换a,b,c,d,即可在一行中调用该函数

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48624364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档