📅  最后修改于: 2023-12-03 15:36:11.132000             🧑  作者: Mango
在编程世界里,有一些词语或者概念是特别神奇的,他们能够让我们的程序变得更加优美、高效、有趣。在这里,我将向大家介绍一些我认为神奇的词。
递归是一种非常有趣和强大的编程思维。它指函数直接或间接地调用自身的过程。在实际编程中,通常用递归解决规模变化的问题,比如二分查找、分治算法等。
# Python代码示例:阶乘递归
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n-1)
lambda是Python中的一个非常特殊的关键字,用于简洁的创建匿名函数。它通常用于需要一个函数,但只需要使用一次的场景。lambda函数可以接受任意数量的参数,但只能有一个表达式。
# Python代码示例:lambda函数求平方
square = lambda x: x*x
print(square(5)) # 输出 25
贪心算法是一种基于贪心思想的算法,它是一种在每一步选择中都采取最好或者最优的选择,从而希望能够产生全局最优解的算法。贪心算法通常适用于可以分成子问题来解决,而且子问题的最优解能递推到全局最优解的问题。
# Python代码示例:硬币找零问题
def coinChange(coins, amount):
coins.sort(reverse=True)
ans = float('inf')
def dfs(amount, coin_count, index):
nonlocal ans
if amount == 0:
ans = min(ans, coin_count)
return
if index == len(coins):
return
coin = coins[index]
max_count = amount // coin
for count in range(max_count, -1, -1):
if coin_count + count + 1 >= ans:
return
dfs(amount - count * coin, coin_count + count, index+1)
dfs(amount, 0, 0)
return ans if ans != float('inf') else -1
分治算法是一种递归的算法思想,其思想是将一个问题分解成多个子问题,并在每个子问题上递归地应用相同的过程,从而得到一个总体的解决方案。通常用于需要将原始问题转换为与其相关的几个子问题的场景。
# Python代码示例:归并排序
def mergeSort(arr):
if len(arr) > 1:
mid = len(arr) // 2
left = arr[:mid]
right = arr[mid:]
mergeSort(left)
mergeSort(right)
i = j = k = 0
while i < len(left) and j < len(right):
if left[i] < right[j]:
arr[k] = left[i]
i += 1
else:
arr[k] = right[j]
j += 1
k += 1
while i < len(left):
arr[k] = left[i]
i += 1
k += 1
while j < len(right):
arr[k] = right[j]
j += 1
k += 1
动态规划是一种将原问题分解成相对简单的子问题来解决的方法。在一些需要进行大量重复计算的问题中,动态规划可以大大减少计算时间。常用于需要求解最优解或者最大值最小值等问题的场景。
# Python代码示例:背包问题
def knapsack(weight, values, max_weight):
n = len(weight)
dp = [[0 for _ in range(max_weight+1)] for _ in range(n+1)]
for i in range(1, n+1):
for j in range(1, max_weight+1):
if weight[i-1] > j:
dp[i][j] = dp[i-1][j]
else:
dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i-1]] + values[i-1])
return dp[-1][-1]