算法笔记--递归

1、n !

亦即n!=1×2×3×...×(n-1)n。阶乘亦可以递归方式定义:0!=1,n! = (n-1) ! × n

#include<cstdio>

int factorial(int n){
    if(n == 0)return 1;                 // 当到达递归边界F(0)时,返回F(0)==1
    else return factorial(n - 1) * n;   // 没有到达递归边界时,使用递归式递归下去
}

int main(){
    int n;
    scanf("%d", &n);
    printf("%d", factorial(n));
    return 0;
}

2、Fibonacci数列(斐波那契数列)

F(0) = 1, F(1) = 1, F(n) = F(n-1) + F(n-2) (n ≥ 2) 

数列的前几项为:1,1,2,3,5,8,13,21,...

递归边界为:F(0)= 1和 F(1)= 1,递归式:F(n) = F(n-1) + F(n-2) 

#include<cstdio>

int Fibonacci(int n){
    if(n == 0 || n == 1)return 1;                      // 递归边界
    else return Fibonacci(n - 1) + Fibonacci(n - 2);   // 递归式
}

int main(){
    int n;
    scanf("%d", &n);
    printf("%d", Fibonacci(n));
    return 0;
}

  

3、全排列(Full Permutation)

#include<cstdio>

const int maxn = 11;
//P为当前排列,hashTable记录整数x是否已经在P中
int n, P[maxn], hashTable[maxn] = {false};
// 当前处理排列的第index号位
void generateP(int index){
    if(index == n + 1){          // 递归边界,已经处理完排列的1-n位
        for(int i=1; i <= n; i++){
            printf("%d", P[i]);  // 输出当前排列
        }
        printf("\n");
        return;
    }
    for(int x=1; x <= n; x++){      // 枚举1-n,试图将x填入P[index]
        if(hashTable[x] == false){  // 如果x不在P[0]-p[index-1]中
            P[index] = x;           // 令P的第index位为x,即把x加入当前排列
            hashTable[x] = true;    // 记x已在P中
            generateP(index + 1);   // 处理排列的第index+1号位
            hashTable[x] = false;   // 已处理完P[index]为x的子问题,还原状态
        }
    }
}

int main(){
    n = 3;          // 欲输出1~3的全排列
    generateP(1);   // 从P[1]开始填
    return 0;
}

4、n皇后问题

猜你喜欢

转载自www.cnblogs.com/zgqcn/p/12229013.html