递归与迭代——爬楼梯与汉诺塔问题

一、递归 与迭代(循环)
递归的注意事项:(把大事化小)
1.要有自己的跳出算法
2.要有逐渐逼近跳出的步骤
递归程序一般可以根据数学公式写出来。
但递归数据也有一定的缺点:有可能增加程序的复杂性。因为大量的数据会被重复性的引用,造成栈溢出。(stack overflow)
具体的应用如汉诺塔,青蛙爬楼梯,Fibonacci数列等

1.汉诺塔

//该问题可以简化为先把one上的n-1个盘子先放到two上
void move(char x, char y)   //再将one上剩下的一个盘子直接移动到three
{                                   //再将在two上的n-1个盘子借助one放到three上
    printf("%c --> %c\n", x, y);  //接下来就层层下放就好了
}
void hanoi(int n, char one, char two, char three)
{
    if (n == 1)
        move(one, three);
    else
    {
        hanoi(n - 1, one, three, two);
        move(one, three);
        hanoi(n - 1, two, one, three);
    }
}
int main()
{
    int n = 0;
    printf("please enter the number of disks:");
    scanf_s("%d", &n);
    printf("the step to move %d disks:\n", n);
    hanoi(n, 'A', 'B', 'C');
    system("pause");
    return 0;
}

2.Fibonacci数列
实际上就是前两个数字之和等于第三个数字。如,
1 1 2 3 5 8 13 21 34 55(前两个数字已给出)
可以分为递归和非递归两种解法,各有其优缺点,不过递归在一定程度上会额外增加程序的重复工作量,造成不必要的计算,从而影响程序运行的效率。

//非递归算法
int Fib(int n)    
{
    int i = 0;
    int a = 1;
    int b = 1;
    int tmp = 0;
    if (n <= 2)
        return 1;
    else
    {
        for (i = 3; i <= n; i++)
        {
            tmp = a + b;
            a = b;
            b = tmp;
        }
        return tmp;
    }
}
//递归算法
int count = 0;
int Fib(int n)
{
    if (n == 3)
        count++;
    if (n <= 2)
        return 1;
    else
    {
        return Fib(n - 1) + Fib(n - 2);
    }
}
int main()
{
    int n = 0;
    int ret = 0;
    scanf_s("%d", &n);
    ret = Fib(n);
    printf("%d\n", ret);
    printf("%d\n", count);
    system("pause");
    return 0;
}

3.青蛙爬楼梯(该问题实际上为Fibonacci数列的变种) 可以分为递归和非递归两种。

//递归算法
int Fibonacci(int n)
{
    if (n <= 2)
        return n;
    else
    {
        return Fibonacci(n - 1) + Fibonacci(n - 2);
    }
}
int main()                                          
{   
    int ret = 0;       //假设有n个台阶,只能选择一次跳一个或者一次两个。
    int n = 0;
    //那么n个台阶中f(n)就可以是1.跳一个f(n-1)2.跳两个f(n-2)
    printf("please input the number :\n");
     //那么就可以看作是f(n)=f(n-1)+f(n-2)   
    scanf_s("%d", &n);
    ret = Fibonacci(n);
    printf("%d\n", ret);
    system("pause");
    return 0;
}

剩下的非递归算法大家可以自己上机实践,增加对递归的理解与应用。

你可能感兴趣的:(C语言)