首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >人塔程序递归

人塔程序递归
EN

Stack Overflow用户
提问于 2019-01-14 19:32:38
回答 3查看 1.5K关注 0票数 0

我试图在使用递归生成一个人形塔之后,在基础层找到最大人数。在人形塔中,每层都有奇数人,顶层只有1人。任意两个相邻层次的差别是2人,我的意思是人数从低层减少到更高层2。假设我们有4个人,那么3人在底层,1人在顶层。如果我们有6人,3人在底部,1人在上面,其余的人被丢弃。

我尝试了下面的代码,并希望改进代码。

代码语言:javascript
复制
x=1
def human_pyramid(no_of_people):
    global x
    if(no_of_people<x):
        return x-2
    else:
        no_of_people-=x
        x+=2
        return human_pyramid(no_of_people)
print(human_pyramid(20))

如果输入是20,输出应该是7。如果输入是10,输出应该是5。如果输入是1,则输出应该是1。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-01-14 19:45:37

考虑下面的代码

代码语言:javascript
复制
def human_pyramid(no_of_people, level=0):
    people_on_row = 2 * level + 1
    if no_of_people < people_on_row:
        return people_on_row - 2
    return human_pyramid(no_of_people - people_on_row, level + 1)

这里,我避免使用全局变量,而是将行号作为附加参数传递,该参数的默认值为零。

输出:

代码语言:javascript
复制
>>> human_pyramid(20)
7
>>> human_pyramid(10)
5
>>> human_pyramid(1)
1
票数 0
EN

Stack Overflow用户

发布于 2019-01-14 19:52:33

所需的计算可以用一个数学公式来表示:

代码语言:javascript
复制
import math
print(int(math.sqrt(no_of_people))*2-1)
票数 0
EN

Stack Overflow用户

发布于 2019-01-14 20:01:38

  1. 重构您的函数以不使用递归。这里限制了python中的递归调用,虽然您可以更改这个限制,但最好避免递归( IMO )。乍一看,如果传递一个相当小的整数,您的函数就会因为这个限制而失败。有关更多信息,请参见here
  2. 不要使用全局。传入该变量,或将其声明为函数中的局部变量。在包含的情况下,您已经创建的函数可能总是有效的,但是在现实环境中,全局引入了可能破坏函数的边缘情况。
  3. 不要使用像'x‘这样的不明确的变量名称。变量名是澄清变量代表什么的机会。
  4. 将类型添加到函数的输入变量和返回类型。为了弄清楚我的意思,下面是一个更新函数头的例子: def human_pyramid(no_of_people: int) -> int:
  5. 在函数标头下面添加一个docstring。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54187998

复制
相关文章

相似问题

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