递归 - 算法学习

来源:互联网 发布:微单哪款好 最好知乎 编辑:程序博客网 时间:2024/06/05 02:42

递归按照递归方式可以分为直接递归和间接递归

1.  直接递归

递归过程p直接调用自己

2. 间接递归

p包含另一个过程d,而d又调用p


递归实例:

1. 汉诺塔问题

#include <stdio.h>#include <stdlib.h>void hanoi(int n, char a, char b, char c){    if(n == 1)        printf("%c -> %c\n", a, c);    else    {        hanoi(n-1, a, c, b);        printf("%c -> %c\n", a, c);        hanoi(n-1, b, a, c);    }}int main(void){    int n;    scanf("%d", &n);    hanoi(n, 'A', 'B', 'C');    return 0;}

2. 八皇后问题

问题分析:

每一个点的行、列和两条对角线都不能造成冲突

(1)当每行被占领后,把相应的标志位置1,列也一样。

(2)对角线有两个方向,同一个对角线上的所有点(下标为(i, j)),那么(i+j)和(i-j都不能再被占用领)c[i+j]=1表示第(i+j)个对角线被占领,为0是代表为没有被占领,d[i-j]=1代表d[i-j]被占领。

#include <stdio.h>#include <stdlib.h>int a[8], b[24], c[24], d[24];void print(void){    static int i = 0;    int j;    i++;    printf("%d: ", i);    for(j = 0; j < 8; j++)        printf("%d ", a[j+1]);    putchar('\n');}void try(int i){    int j;    for(j = 0; j < 8; j++)    {        if((b[j]==0) && (c[i+j]==0) && (d[i-j]==0))        {            a[i] = j;            b[j] = 1;            c[i+j] = 1;            d[i-j] = 1;            if(i < 8)                try(i+1);            else                print();            b[j] = 0;            c[i+j] = 0;            d[i-j] = 0;        }    }}int main(void){    int i;    for(i = 0; i < 24; i++)    {        b[i] = 0;        c[i] = 0;        d[i] = 0;    }    try(1);    return 0;}

3. 递归求一个数组的元素最大值

#include <stdio.h>#include <stdlib.h>int max(int arr[], int len){    if(len == 1)        return arr[0];    int a = arr[0];    int b = max(arr+1, len-1);    return (a>b ? a : b);}int main(void){    int n, i, x;    int a[10];    scanf("%d", &n);    for(i = 0; i < n; i++)    {        scanf("%d", &a[i]);    }    x = max(a, n);    printf("%d\n", x);    return 0;}

4. 递归逆序输出一个字符串

#include <stdio.h>#include <stdlib.h>void reverse(void){    char ch;    scanf("%c", &ch);    if(ch != '.')    {        reverse();        printf("%c", ch);    }}int main(void){    reverse();    return 0;}

0 0
原创粉丝点击