- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
有人能告诉我我当前的代码是否可能吗?我必须在不使用任何循环的情况下创建带有输入的 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()
最佳答案
我们可以定义一个递归 pascal
使用辅助函数,pairs
pascal
将返回 [[Int]]
(一个 Int 数组的数组)——例如,pascal(3)
会回来
[ [1],
[1, 1],
[1, 2, 1] ]
def pairs (xs):
if 2 > len(xs):
return []
else:
return [xs[0:2]] + pairs(xs[1:])
def pascal (n):
def compute (prev):
return [1] + [x + y for (x,y) in pairs(prev)] + [1]
def aux (m, prev):
if (m > n):
return []
else:
return [prev] + aux(m + 1, compute(prev))
return aux(1, [1])
[print(line) for line in pascal(5)]
# [1]
# [1, 1]
# [1, 2, 1]
# [1, 3, 3, 1]
# [1, 4, 6, 4, 1]
pascal
函数——我们写的所有其他东西都是从我们写的方式中诞生的
pascal
,所以我会先回顾一下。
pascal
的基础功能
def my_recursive_func (<parameters>):
def aux (<state_parameters>):
if (<base_condition>):
return <base_value>
else
return aux(<updated_state>)
return aux(<initial_state>)
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
使用 m + 1
并且我们可能会使用某种数组连接来更新行——在我们编写更多代码之前不确定initial_state
– 我们将开始 m
在 1
pascal的第一行是[1]
def pascal (n):
def aux (m, prev):
if (m > n):
return ?
else:
return aux(m + 1, ?)
return aux(1, [1])
pascal
像这样构建我们的结果
[[1]] + [[1, 1]] + [[1, 2, 1]] + [[1, 3, 3, 1]], ...]
# => [ [1], [1 ,1], [1, 2, 1], [1, 3, 3, 1], ... ]
base_value
和更新状态
prev
,我们需要考虑这个返回类型。我们要回
[[Int]]
,这是一个列表,所以
base_value
可以简单地为空列表,
[]
.
[prev]
并将(
+
)它也连接到递归结果......
[prev] + aux(m + 1, <next_row>)
pascal
再次看看我们必须完成什么
def pascal (n):
def aux (m, prev):
if (m > n):
return []
else:
return [prev] + aux(m + 1, <next_row>)
return aux(1, [1])
# given
[1,2,1]
# the next row is
[1, (1 + 2), (2 + 1), 1]
# given
[1, 4, 6, 4, 1]
# the next row is
[1, (1 + 4), (4 + 6), (6 + 4), (4 + 1), 1]
1
开头的新数组。 ,然后对于前一行中的每一对数字,将这两个数字加在一起并将每个和附加到数组中,然后最后附加另一个
1
.我们可能会在 python 中表达,就像使用这样的列表理解一样
[1] + [x + y for (x,y) in pairs(prev)] + [1]
pairs
功能。
pairs
应该有以下契约(Contract)
pairs([]) => []
pairs([a]) => []
pairs([a,b]) => [[a,b]]
pairs([a,b,c]) => [[a,b],[b,c]]
pairs([a,b,c,d]) => [[a,b],[b,c],[c,d]]
pascal
之外实现了这个函数因为它是一个通用函数,并且本身就很有用。要计算帕斯卡行,我们需要添加数字对,但添加或我们如何获得这些对或数字不应该作为
pascal
的责任。功能本身。
def pairs (xs):
if 2 > len(xs):
return []
else:
return [xs[0:2]] + pairs(xs[1:])
print(pairs([])) # []
print(pairs([1])) # []
print(pairs([1,2])) # [[1,2]]
print(pairs([1,2,3])) # [[1,2],[2,3]]
print(pairs([1,2,3,4])) # [[1,2],[2,3],[3,4]]
pascal
再次运行以查看我们所处的位置
def pascal (n):
def aux (m, prev):
if (m > n):
return []
else:
return [prev] + aux(m + 1, [1] + [x + y for (x,y) in pairs(prev)] + [1])
return aux(1, [1])
aux
调用下一行的内联计算看起来有点忙。让我们在
pascal
中添加另一个助手叫
compute
清理东西。现在我们完成了!
def pascal (n):
def compute (prev):
return [1] + [x + y for (x,y) in pairs(prev)] + [1]
def aux (m, prev):
if (m > n):
return []
else:
return [prev] + aux(m + 1, compute(prev))
return aux(1, [1])
main
如下所示——这使所有 I/O 与我们的
pascal
分开和
pairs
职能。在程序的早期考虑这种关注点分离和副作用管理很重要,因为重用功能超出我们希望的功能是很困难的。
def main ():
try:
print("Pascal triangle generator")
n = int(input("Pascal(x): x = "))
if n < 1: raise
[print(line) for line in pascal(n)]
except:
print("enter a non-zero positive integer")
main()
# run program
main()
pascal(300)
或一些令人印象深刻的结果
关于python - 帕斯卡三角形通过递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43687857/
我有一个大问题,因为这段代码在 Dev-Pascal 中正确编译,但在 Lazarus 中却没有。 for k:=1 to n do begin writeln(a[k
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我有一个与 Pascal 中的 for 循环工作方式相关的问题: Program example; var i:integer; Begin i:=7; for i:=1 to i
PROGRAM RandomNumber; Var rand,count,guess : integer; LABEL correct, loop, wrong, end1; begin {Initi
我是新来的,如果我做错了什么,很抱歉! 我正在 Lazarus 中制作一个简单的 Pascal 程序,编译时出现此错误: HWE(16,18) 错误:“Char”和“Constant String”类
这个问题已经有答案了: What is the implementation of sets used in pascal? (2 个回答) 已关闭 6 年前。 我明天要去参加一个高中编程比赛,他们使
我正在用 pascal 编写一个小程序,但遇到了一个小问题。在其他语言中,有一个名为“split”或“explode”的函数,用于获取由定义的字符分隔的长字符串,并将该长字符串拆分为几个较小的字符串,
我在Pascal中找了很长时间这个算法并没有找到,我只在C++中找到了它,这令人沮丧。然后我决定将 C++ 代码翻译为 Pascal,但是有一些问题我无法解决。出现错误消息“浮点溢出”。我需要帮助才能
例如,如果我有这样的数组,如何获取具有特定索引的数组的长度 TYPE T_PERSON = PACKED RECORD Example : STRING[40]; Example2 : STR
我正在尝试使用 创建 TForm 的子类 针对某些情况的特殊构造函数,以及 将保持与当前代码的兼容性的默认构造函数。 这是我现在的代码: interface TfrmEndoscopistSear
我的插入排序算法出现此错误: insertionsort.lpr(19,17) Error: Incompatible types: got "Boolean" expected "LongInt"
我的任务是在我的屏幕上显示两个图像(两个 TImage),一个是头部,另一个是尾部(硬币),并带有一个 TButton 来随机化它们。 就是当你按下按钮时,两个图像会随机选择正面或反面。 我知道这是一
我正在编写一段代码来读取 CSV 文件并从中解析信息(目前我只有代码的开头部分,它将在文件开头的标题中读取。当我尝试编译这段代码,我在行中收到一个错误,它占用了文件中行的长度。 我收到的错误是:[Er
我正在开发一个 Java 应用程序,它是关于将 Mathcad 工作表转换为 Java 应用程序的。谁能知道/建议如何用 Java 代码编写单位(牛顿、帕斯卡、毫米、千克)? 例子:1? double
我是一名优秀的程序员,十分优秀!