有人能告诉我我现在的代码是否可行吗?我必须在不使用任何循环的情况下使用输入创建Pascal三角形。我注定要递归
我花了3天的时间在这上面,这是我能想到的最好的输出
def pascal(curlvl,newlvl,tri):
if curlvl == newlvl:
return ""
else:
tri.append(tri[curlvl])
print(tri)
return pascal(curlvl+1,newlvl,tri)
def triLvl():
msg = "Please enter the number of levels to generate:"
triheight = int(input(msg))
if triheight < 1:
print("\n Sorry, the number MUST be positive\n Please try again.")
return triLvl()
else:
return triheight
def main():
triangle = [1]
curlvl = 0
print("Welcome to the Pascal's triangle generator.")
usrTri = triLvl()
print(triangle)
pascal(curlvl,usrTri,triangle)
main()
我们可以使用辅助函数
pairs
定义递归pascal
pascal
将返回[[Int]]
(Int数组的数组)–例如,pascal(3)
将返回好的,我会先给你看所有的代码,然后我会一步一步地解释一些细节
解释
我们真正关心的是
pascal
函数——我们所写的所有其他东西都是从我们写pascal
的方式中产生的,所以我将首先介绍一下编写递归函数的一种非常常见的方法是使用一个内部辅助函数来跟踪计算的各种状态。我们将使用此技术作为
pascal
函数的基础我们已经知道如何为我们的
pascal
函数填写一些样板文件parameters
应该是n
,一个整数,因为我们希望调用像pascal(3)
或pascal(5)
之类的函数——不应接受其他参数state_parameters
–我们现在只知道两件事:1)我们需要一些值m
,它的计数为n
,每次递增1
,2)一些值允许我们计算下一行;我们将其称为prev
,因为每个pascal行都是基于前面的行计算的base_condition
–当m == n
我们知道我们已经生成了所有需要的行时,这就是我们想要停止递归的时候base_value
–这是最后一个返回的值–不太确定应该是什么updated_state
–我们将使用m + 1
更新m
,并且我们将使用某种数组连接来更新行–在编写更多代码之前并不完全确定initial_state
–我们将从{好的,让我们填一下到目前为止的内容
我们想做的是让
<>所以,为了写^ {CD21>}和更新状态为{{CD18>},我们需要考虑这个返回类型pascal
构建我们的结果,类似这样[[Int]]
,这是一个列表,因此base_value
可以是空列表[]
这意味着,在每一步中,我们实际上都希望采用
[prev]
并将它连接到递归结果中(+
)我们现在非常接近了,让我们再次更新
pascal
,看看我们必须完成什么好了,这是最难的pard–计算下一行,对吗?其实还不算太糟
或者另一个例子
因此,模式是这样的:创建一个新数组,从
1
开始,然后对前一行中的每一对数字,将两个数字相加,并将每个和追加到数组中,最后追加另一个1
。我们可以用python来表达这一点,就像使用这样的列表理解一样现在我们只需要找出
pairs
函数pairs
应具有以下合同让我们现在实施它,并验证我们的实施是否符合合同要求。注意,我在
pascal
的pascal
函数本身的责任好了,我们现在真的很接近了。让我们再次更新
pascal
函数,看看我们现在的位置天哪!我们已经做完了。带有下一行内联计算的
aux
调用看起来有点忙。让我们在pascal
中添加另一个名为compute
的助手来清理问题。现在我们完成了彻底
如果你想让那些愚蠢的文本和提示显示出来,你可以写
main
一些东西如下所示,这使所有I/O与pascal
和pairs
函数保持分离。这种关注的分离和副作用的管理在程序的早期是很重要的,因为重复使用比我们希望的更多的功能是困难的。p>继续运行
pascal(300)
或其他程序,获得一些令人印象深刻的结果递归Pascal三角形作为列表:
我希望它能有所帮助,我不知道“zip”和“map”是否被视为循环(它们肯定包含循环)
我不知道这是否是您想要的,但它工作得很好:
相关问题 更多 >
编程相关推荐