看到这个加法求和,我自闭了

本文介绍了如何在Python中解决一个特殊的加法求和问题,不能使用if, for, while, else等关键字以及条件判断语句。通过递归和短路逻辑,分别使用lambda和and操作符实现求和。文章详细解析了递归思路和短路逻辑的工作原理,并展示了同班同学的解决方案。" 131137468,11824954,Python数据保存:选择最佳策略,"['Python编程', '数据管理', '数据库技术', '缓存系统', '云存储']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#关于加法求和:

###现在有一个题的条件极为苛刻。要求用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的话)。

关键字:短路逻辑递归条件判断

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值