鱼C论坛

 找回密码
 立即注册
查看: 2310|回复: 2

两Python难题,求大神解答。

[复制链接]
发表于 2016-4-11 10:57:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
第一题:
code
## 函数接受一个形式参数,返回另一个函数而且又返回参数##
def relay(arg):
    print('relayed')
    def g():
        return arg
    return g

问题: 如果我们输入 relay(relay)()(9)(), 那么系统会返回什么?
答案:  relayed
            relayed
            9
relay(relay) 这部分理解,就是(relay)()(9)()后面三个括号加起来后就不了解了。
求高手讲解下怎么解析。

第二题:
code
##这个函数是把一个正整数n,分成几个正整数的和, m代表这几个正整数中最大。 然后这个函数返回值是有多少种方法切割正整数n##

def c_part(n,m):
    if n == 0:
        return 1
    elif n < 0:
        return 0
    elif m == 0:
        return
    else:
        with_m = c_part(n-m,m)
        without_m = c_part(n,m-1)
        return with_m + without_m

比如说  c_part(6,4)
         >>> 9
如果我们手算也是可以验证:
2+4=6
1+1+4=6

3+3=6
1+2+3=6
1+1+1+3=6
2+2+2=6
1+1+2+2=6
1+1+1+1+2=6
1+1+1+1+1+1=6
总共9种。with_m 表示蓝色那两个算式,代表最大是4时候,其余表示最大不是4时候.

我不理解的地方是,假设我们用 c_part(6,4), 那么 with_m =  c_part(2,4). 想不通,为什么要n-m?

谢谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-4-12 10:51:05 | 显示全部楼层
根据第一个函数,分步运算,就比较容易理解了。
>>> a = relay(relay)
relayed
>>> a
<function relay.<locals>.g at 0x0241A8A0>
>>> b = a()
>>> b
<function relay at 0x02A548E8>
>>> b(9)
relayed
<function relay.<locals>.g at 0x02A472B8>
>>> c = b(9)
relayed
>>> c
<function relay.<locals>.g at 0x02A47300>
>>> c()
9
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-4-13 11:56:53 | 显示全部楼层
dx4789 发表于 2016-4-12 10:51
根据第一个函数,分步运算,就比较容易理解了。
>>> a = relay(relay)
relayed


谢谢
那第二个呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-2-20 14:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表