我被要求实现一个递归函数,它以非负整数n作为输入并返回用字母L,R和F编码的turtle指令,其中L表示向左旋转45度,R表示向右旋转45度,F表示向前旋转
附加信息我有:对于每个非负整数n> 0,Levy曲线L(n)
可以用Levy曲线L(n-1)
来定义;征费曲线L(0)
只是一条直线。
usage:
>>> lev(0)
'F'
>>> lev(1)
'LFRRFL'
我对此非常陌生,我不知道如何开始:
到目前为止,我只得到了: from turtle import Screen, Turtle
def lev(n):
# base case
if n ==0:
return 'F'
# recursive case
else:
return lev(n-1)
我在这里需要一些好的指示。
答案 0 :(得分:5)
由于Levy C的L system只有一条规则,因此使用单replace方法构建结果字符串很简单。
def lev(n):
if n == 0:
return "F"
else:
symbols = lev(n-1)
return symbols.replace("F", "LFRRFL")
for i in range(4):
print lev(i)
结果:
F
LFRRFL
LLFRRFLRRLFRRFLL
LLLFRRFLRRLFRRFLLRRLLFRRFLRRLFRRFLLL
您可以通过想象图中的每条直线被以90度角连接的两条较小的线代替来可视化这种替换。像这样:
答案 1 :(得分:1)
首先,如果这是问题:一个大的Levy曲线(递归情况)是通过在房间内安排两个彼此相对的较小的一个来构建的,其中两个“在地板上”面朝上,在两者之间。一条小Levy曲线(基本情况)只是一条直线。事实上,基本情况是:
def lev(n):
if n == 0:
return 'F'
else:
# Recursive case here
但是对于递归情况,你只需要调用lev(n-1)。你是对的,你需要这样做,但你需要做四次,然后在两者之间旋转。这将创建所需的'两条彼此面对的较小曲线,其间有两条'。
仔细检查曲线(这里:https://en.wikipedia.org/wiki/File:Levy_C_construction.png),我们看到我们需要绘制一条曲线,然后向右转,然后绘制另一条曲线,然后完全转动,然后绘制第三条曲线,最后,右转并绘制最终曲线。
这可以相当简单地完成:
dev lev(n):
if n == 0:
# Base case
return 'F'
else:
# Recursive case
# Calculate the smaller curve
smaller = lev(n-1)
# Add in the turning in between the smaller curves
final = smaller # First curve
if n%2 == 0: # Even depths require right turns
final += 'RR' # Rotate 90 degrees
final += smaller # Second curve
final += 'RRRR' # Rotate 180 degrees
final += smaller # Third curve
final += 'RR' # Rotate 90 degrees
final += smaller # Final curve
else: # Odd depths require left turns
final += 'LL' # Rotate 90 degrees
final += smaller # Second curve
# (No full rotation in odd depths)
final += smaller # Third curve
final += 'LL' # Rotate 90 degrees
final += smaller # Final curve
return final # Done!
答案 2 :(得分:0)
我的答案
import turtle
def draw(n):
l=10
if n == 0:
turtle.forward(l)
else:
turtle.left(45)
draw(n - 1)
turtle.right(45)
turtle.right(45)
draw(n-1)
turtle.left(45)
draw(12)