降低以下代码复杂度n=int(input().strip()) def fun(n): if n==1 or n==2: return 1 elif n==3: return 2 else: return fun(n-1)+fun(n-3) print(fun(n))
时间: 2024-02-19 21:57:55 浏览: 90
可以使用记忆化搜索来优化这段代码,避免重复计算。具体来说,可以使用一个字典来存储已经计算过的值,避免重复递归。
具体代码如下所示:
```python
n = int(input().strip())
# 利用字典存储已经计算过的值
memo = {}
def fun(n):
if n == 1 or n == 2:
return 1
elif n == 3:
return 2
# 如果已经计算过,直接返回结果
if n in memo:
return memo[n]
# 否则递归计算
result = fun(n - 1) + fun(n - 3)
# 将结果存入字典
memo[n] = result
return result
print(fun(n))
```
使用记忆化搜索后,代码的复杂度将大大降低。
相关问题
def power(a, n): if n < 0: return 1/power(a, -n) elif n == 0: return 1 elif n % 2 == 0: temp = power(a, n / 2) return temp * temp else: temp = power(a, (n - 1) / 2) return a * temp * temp a = float(input("请输入底数 a:")) n = int(input("请输入指数 n:")) result = power(a, n) print(f"{a}的{n}次幂为: {result}")算法结果分析、时间复杂度分析、空间复杂度分析
这个算法是用递归的方式来计算一个数的指数幂。当指数为负数时,将其转化为正数的倒数进行计算。
时间复杂度分析:
由于每次将n折半,因此递归的深度为log(n),每次递归操作都是O(1)的,因此总的时间复杂度为O(log(n))。
空间复杂度分析:
由于进行了递归操作,因此需要开辟一定的栈空间来存储每次递归时的参数和局部变量。栈空间的大小取决于递归的深度,因此空间复杂度也为O(log(n))。
降低代码复杂度import itertools if name == "main": nums = list(map(int, input().split(","))) n = int(input()) combinations = [] nums.sort() for i in range(n, len(nums) + 1): for combination in itertools.combinations(nums, i): combinations.append(",".join(map(str, combination))) if len(combinations) > 0: for s in sorted(combinations): print(s) else: print("None")
可以使用Python的列表推导式和join函数来简化代码,如下所示:
```python
import itertools
if __name__ == "__main__":
nums = list(map(int, input().split(",")))
n = int(input())
combinations = [",".join(map(str, combination)) for i in range(n, len(nums) + 1) for combination in itertools.combinations(nums, i)]
if combinations:
for s in sorted(combinations):
print(s)
else:
print("None")
```
使用列表推导式可以将两重循环合并成一行,使用join函数来将元组转换成字符串。同时,使用if combinations:来判断combinations是否为空,这样可以避免使用len函数来判断长度,也能减少代码复杂度。
阅读全文