题解 | #放苹果# 高中生看得懂:盘子个数/n元 1次方程的非负整数解的个数, 递归 python
放苹果
http://www.nowcoder.com/practice/bfd8234bb5e84be0b493656e390bdebf
求fun(app, d):
(按题意:app>=0,d>=1,但代码中有app-d,不能保证输入的app>0, 而题目确保d>=1,递归出口有d=1, 且所以d不会再小)
拆分成2种情况(不重不漏):
1.某些盘子没有app。具体哪些盘子空着?不管。只要1个盘子没有app,则满足这点。其他的盘子的情况?问老爸(下一轮迭代)
2.所有盘子都有app。往每个盘子仍1个app。则满足了这点。各盘子有多少app?问老爸(下一轮迭代)
return fun(app,d-1)+fun(app-d,d)
递归出口:
1.app <0:d个非负整数 求和为负数 的一次方程,无解。return 0
2.app==0,错误理解:“没苹果了,没法分,解决方法数为0”。
if app==0: return 0
但其实,a1+a2+...+an = 0这个方程有1个解。全0解。retunr 1才对。
- app>0, d==1: return 1
理解方法:方程a1 = app, 解只有一个,就是a1 = app。
python:
def fun(app, d): if app <0: return 0 else: #这行改成 if app==0也行,但要多跑几遍fun(app,d-1)直到 d=1 if app==1 or app==0: return 1 else: if d==1 : return 1 else: return fun(app,d-1)+fun(app-d,d) while 1: try: l=input().split(' ') app,d=tuple(map(int,l)) print(fun(app,d)) except: break