#关于加法求和:
###现在有一个题的条件极为苛刻。要求用python编程做到1到100的求和,但不能使用if,for,while,else等关键字与条件判断语句,同时不能使用乘除法
看到这道题。我首先想到了以前学的递归,所以是优先考虑的递归的写法
根据递归的需要满足的两个条件:
1.基线条件(什么条件下终止递归),当n<=0时,递归必须终止到0
2.递归条件(什么条件下需要递归),当n>0时,summery(n)=n+summery(n-1)
所以可以得到下面的程序
def summery(n):
if n<=0:
return 0
else:
s = n+summery(n-1)
summery(100)
但其中当时是没有仔细的看题目中的不让用if等条件判断语句
等我幡然醒悟看懂,就感觉这题有点变态,条件限制的有点死了。
后续在高级函数里学到一个函数reduce(func,iterable),这个前面是function,后面是这个function的输入,开始iterable的两个元素送到function里做计算,然后做了计算的结果和iterable里的第三个元素送到function里计算,…,直到function里的元素计算完毕为止。
考虑到1+2+…99+100=(1+2+…+99)+100=((1+2+…+98)+99)+100…
所以这里的函数就是两个数相加,iterable就是[1,2,…,100],这个可以利用range(1,100)生成然后转化类型。
from functools import reduce
def add(x,y):
return x+y
s = list(range(1,100))
s1 = reduce(add,s)
如果考虑该add函数比较简单,可以使用匿名函数(lambda)
将其转化为
from functools import reduce
s1 = reduce(lambda x,y:x+y,list(range(1,100)))
后续老师要求不使用系统的包。这样就。。。。一言难进了
同班的有一个人做出来了。她用的是下面的结构
def func(n):
return n<=1 or n+func(n-1)
func(100)
在程序执行时,也是能执行的,虽然以前就有指导or,and 逻辑表达式与数学意义上的不一样,但还是看了相关的书籍,发现其是用了短路逻辑,该逻辑简单说表达如下:
A or B,在计算机中的执行是如果A成立,返回A(1);如果A不成立,返回B
A and B,在计算机中的执行是如果A不成立,返回A(0);如果A成立,返回B
这个逻辑可以用来做选择
用大白话说上面程序的执行就是
这是一个递归程序,如果输入的数字小于等于1,返回1(这是基线条件,对应电路的短路工作);如果输入的数字大于1,需要做递归(递归条件,对应电路的正常工作);逻辑与第一个递归函数是一样的。这里的提示是可以通过or或者其他的逻辑关系做选择关系。
在注意到这个提示或者说这个知识点后,我们可以’对标‘做一个用and做选择的程序
依然是使用短路对应基线条件,即A不成立时,程序终止递归,此时返回的是0;当A不成立时,程序对应的执行递归,递归的条件一样是n+func(n-1);所以重点在and的第一个条件上,对应于返回0的是f(0),所以当输入为0时不成立,当输入为1,2,3,…,100时条件成立。条件可以写成n>0。
所以程序如下:
def func(n):
return n>0 and n+func(n-1)
func(100)
这个题考虑的时间比较长,怕以后忘记了,特别记一下。
这里的递归是比较耗内存的。对于这个问题暂时没有想到什么好办法(如果不使用for ,while的话)。
关键字:短路逻辑,递归,条件判断