基础——递归recursion 与 迭代iteration

递归和迭代都是循环的一种

  1. 递归:函数自己重复调用自己实现循环。典例:斐波那契
  2. 迭代:在函数内某段代码实现循环。典例:从1递增到100,求和。迭代则使用计数器结束循环

提到递归recursion,最容易令人想起的是…兔子繁衍 → 斐波那契数列(Fibonacci sequence),又称黄金分割数列,定义为:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)。

1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368…

由意大利数学家列昂纳多·斐波那契(Leonardoda Fibonacci)提出。(剩下自行baidu吧)

这是他老人家
基础——递归recursion 与 迭代iteration_第1张图片我不知道为什么要放他照片…显得文章没那么单调吧

#include
int Fi (int i)  //Fi for Fibonacci
{
    if( i < 2 )
        return i == 0 ? 0 : 1;

    return Fi (i - 1) + Fi (i - 2);  //函数自己在调用自己
}

int main(){
    int i;
    printf("斐波那契数列:[递归]\n");

    for(i = 0;i < 10;i++) //显示前10个
        printf("%d \n", Fi (i));
    return 0;

}

基础——递归recursion 与 迭代iteration_第2张图片

让我们来数一下兔子

def Fib(n) :    #n为月数

    if  n < 1 :
        return -1
    if n ==1 or n == 2 :
        return 1
    else :
        return  Fib(n-1) + Fib(n-2)

#n个月后兔子的总对数是???
result = Fib(10)
if result != -1 :
    print('10个月后就有%d对兔子了。' % result)

这里写图片描述

当然除了经典的斐波那契,还可以联想到小经典的阶乘
让我们继续用python来试试

#循环
def factorial(n) :
    res = n
    for i in range(1,n):    
        res *= i                #注意:这里是5 * 1 * 2 * 3 * 4 【range(1,n)是:0 ~ n-1】
    return res

num = int(input('请输入一个正整数:'))
result = factorial(num)
print('阶乘结果是:',result)
#递归
def factorial2(n) :
	if n == 1 :
		return 1
	else :
		return n * factorial2(n-1)     #有没有感觉很熟悉
		
num = int(input('请输入一个正整数:'))
result = factorial2(num)
print('阶乘结果是:',result)

这里写图片描述

除了上述所提到的斐波那契数列和阶乘,还有汉诺塔游戏、树结构的定义、谢尔宾斯基三角形、递归自拍等经典板栗。

一个完整的递归:

  • ①有调用函数自身的行为
  • ②有一个正确的返回条件(有停止的条件)

但是,递归有危险性:每次函数自己调用自己都要进行压栈进栈的操作,是非常消耗空间和时间的

那么使用迭代iteration来显示斐波那契数列会是什么样呢?

#include
#define Fi(n);

int main(){

	int i;
	int Fi [10];    //Fi for Fibonacci
	printf("显示斐波那契数列:[迭代]\n");

	Fi [0]=0;
	Fi [1]=1;
	printf("%d\n",Fi [0]);
	printf("%d\n",Fi[1]);

	for(i=2;i<10;i++){
		Fi [i]=Fi [i-1]+Fi [i-2];
		printf("%d\n",Fi [i]);
	}
	return 0;
}

基础——递归recursion 与 迭代iteration_第3张图片

对比一下两种实现斐波那契的代码

| NAME | 递归 |迭代|
| :--------| -------
|区别|选择结构(if else 调用自己,并在合适时机退出)|循环结构(for,while循环)|
|程序的结构|更清晰、更简洁、可读性强| |
|缺点|可能耗费大量的时间和内存 | |
|联系|从计算机角度讲,递归是迭代的特例。

Markdown这个表格…

你可能感兴趣的:(Rookies,算法)