c语言学习-函数的递归调用(先回溯后递推,核心是函数关系的建立)

一、求n!

解决思路:

n!={1                   (n=0,1)n(n1)!  (n>1)

C代码实现:

#include 

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

/*  求n!;建立函数关系:
 1.  n!=1;n=0,1   
 2.  n!=n*(n-1)!;n>1  */

int f(n) 
{
 int Z;
 if(n==0||n==1)
   z=1;
 else
   z=n*f(n-1);
 return z; 
}

二、hanoi塔问题(汉诺塔)

题目:现有A、B、C三个倒T型塔,A上有从上到下半径递增的碟子64个,B、C为空,要求将A上的碟子移动到C上,每次只能移动1个碟子,且移动过程保持大的在下小的在上。
c语言学习-函数的递归调用(先回溯后递推,核心是函数关系的建立)_第1张图片
解决思路 :设共有碟子m个,利用递归思想,先回溯后递推(从第m个回溯到第1个,再由第一个求第m个)。移动次数为 2m ;
1. m=1,直接将A->C;
2. m>1,先将A上m-1个碟子移动到B,再把A上的第m个(最底层的一个)移动到C,最后将B上的m-1个碟子移动到C。
C代码实现:

#include 

int main()
{
    int n;
    void hanoi(int m, char a, char b, char c);      
    printf("hanoi问题\n请输入要移动的碟子个数:\n");
    scanf("%d",&n);
    hanoi(n,'A','B','C');
}

void hanoi(int m,char a,char b,char c)
{
    void move(char x, char y);
    if (m == 1)
        move(a, c);
    else 
    {
        hanoi(m - 1, a, c, b);
        move(a, c);
        hanoi(m - 1, b, a, c);
    }
}

void move(char x, char y)
{
    printf("%c->%c\n", x, y);   
}

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