递归和迭代_【Recursion】通过递归 VS 迭代 深入理解递归过程

aa4a246ce2b0ceea28a76bffc7b2fa78.png
什么是迭代-Iterative:重复某些操作,直到满足某些结果

迭代-Iterative的基本形式

包括循环和条件语句,来决定是否继续执行或者停止

33efaa8a72e7e4b5199f3a3e01209d84.png

迭代-Iterative的基础语法

def IterativeFunction() :
  <some local variables if required>
  while <someCondition == TRUE> :
    # Perform a task

递归、迭代全面对比

1、定义

递归:程序反复执行,直到基本条件得到满足

迭代:循环执行某些操作,直到条件满足

2、应用

递归:递归的一般执行对象是函数,即反复调用某个、某些函数

迭代:迭代的一般执行对象是变量,即对变量(list)反复执行某些操作

3、代码长度

递归:短、小、精简

迭代:长且杂乱

4、速度

递归:慢

迭代:快


对比案例1:Calculating Factorial

### Iterative
def factorial(targetNumber) :
  index = targetNumber - 1 # set the index to target - 1
  while index >= 1 :
    targetNumber = targetNumber * index # multiply targetNumber with one less than itself, i.e, index here
    index -= 1 # reduce index in each iteration
  return targetNumber

# Driver Code
targetNumber = 5
result = factorial(targetNumber)
print("The factorial of " + str(targetNumber) + " is: " + str(result))


### Recursive
def factorial(targetNumber) :
  # Base case
  if targetNumber == 1 : # Factorial of 1 is 1
    return 1
  # Recursive case
  else :
    return (targetNumber * factorial(targetNumber - 1)) 

# Driver Code
targetNumber = 5
result = factorial(targetNumber)
print("The factorial of " + str(targetNumber) + " is: " + str(result))

对比案例2:反转字符串

ca579e99b90fda9328bf5d0304ec9308.png
### Iterative

def reverseStringIter(string):
    reverse = ''
    len = length(string)-1
    while len>=0:
        reverse = reverse + string[len]
        len = len-1

# Driver Code
targetVariable = "Educative"
print(reverseStringIter(targetVariable))


### Recursive
def reverseStringRec(string):
    if len(string)==0: return string
    else:
        return reverseStringRec(string[1:])+string[0]

# Driver Code
targetVariable = "Educative"
print(reverseStringRec(targetVariable))

对比案例3:计算string中的元音字母数

# helper function
def isVowel(character):
    character = character.lower()
    vowels = 'aeiou'
   
    if character in vowels: return 1
    else: return 0

### Iterative
def main_iter(string):
    count = 0
    # Condition
    for i in string:
        if isVowel(i): 
            count += 1
    return count

### Recursive
def main_recur(string, n):
    # Base function
    if n==1:
        return isVowel(string[0])
    return main_recur(string[1:],n-1) + isVowel(string[0])

思路

循环:在主函数中循环string的每个字符,使用helper function判断每个字符是否为元音

递归:递归执行主函数,并将中间步骤以栈的方式存储;在函数满足base condition之后,反向执行计算操作

036af6dac6ae3427b61c30df0173ebc1.png
递归执行元音字母的判断

对比案例4:计算某个数的平方

Mathematically we know that:

### Iterative
def findSquare(testVariable) :
  return testVariable * testVariable

### Recursive
def findSquare(targetNum):
    # Base case
    if targetNum==0: return 0
    else:
        return findSquare(targetNum-1) + 2*targetNum + 1

9a02b1d6f58c1888086e3489604bd927.png

对比案例5:寻找某个值出现的index

输入

  • A variable arr that contains the array that will be searched.
  • A variable testVariable, being the number that will be searched.
  • A variable currentIndex that contains the starting index of the arr array.
### Iterative
def firstIndex(arr, testVariable, currentIndex) :
  if testVariable not in arr: return -1
  else:
    for i in range(len(arr)):
      if arr[i] == testVariable:
        return i
      else: pass
    return None


### Recursive
def firstIndex(arr, testVariable, currentIndex):
  if len(arr)==currentIndex:
    return -1
  if arr[currentIndex]==testVariable:
      return currentIndex

  else: return firstIndex(arr, testVariable, currentIndex+1)

对比案例6:计算斐波那契数列

### Recursive
def fibonacci(testVariable):
    if testVariable <= 1 :
        return testVariable
    return(fibonacci(testVariable - 1) + fibonacci(testVariable - 2))

### Iterative
def fibonacci(testVariable):
  fn0 = 0
  fn1 = 1
    
  for i in range(0, testVariable):
    temp = fn0 + fn1

    # Setting variables for next iteration
    fn0 = fn1
    fn1 = temp

  return fn0

5ef2d1524fcba435605c3b70893eac29.png

点赞❤️ 评论+收藏, 算法路上我们同行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值