递归,个人经验

重点:

1.待解问题 必须能被分解成相同问题的子问题。

2.分清属于两种递归中的那一种,一种直接递归,一种间接递归。

直接递归:函数内部就开始调用自身,形成递归

间接递归:如:fun_a 调用fun_b,而fun_b反过来再调用fun_a,形成递归

3.******if条件结束语句,一定要写(最好直接写在函数开头,免得后面写的忘性了,就忘记了)!!!

 

例子:

1.阶乘:

代码:

long JC(int n)
{
        if(n <= 1)
        return n;

        else
                return n*JC(n-1);

}

2.汉诺塔(A,B,C三个柱子,把A上的盘子全移到C上,大的只能在小的下面)。

按照上面的三点:

1.  一共分三步进行。第一:把A上的n-1个移到b上,第二:把A上最后一个移到C,第三:把B上的n-1个移到C

三步可以分别理解为:

(A,C,B),(A,B,C),(B,A,C)

(对于第一步上的(n-1个的)B的处理。第一:(n-1-1)移到A。第二:剩下最大的到C,第三剩下的A上的(n-1-1)移到C)

...

...

...

此时从括号里开始现成了一个回到A的循环!!!(把n-1-1个移到C)。个人觉得,这是思想上最重要的一点!

2.直接调用

3.结束就是最后一个从A到C

 

我刚开始就是懒得去想,觉得简单,结果一直似懂非懂的,代码也写不出来。事实证明还是要脚踏实地,多学多练。

代码:

#include <stdio.h>
void hnt(char a,char b,char c,int n);

int cnt;
int main()
{
        int i;
        //char A,B,C;
        cnt = 0;
        printf("请输入汉诺塔盘子个数:");
        scanf("%d",&i);
        hnt('A','B','C',i);

        printf("一共移动了%d步\n",cnt);


        return 0;
}

void hnt(char a,char b,char c,int n)
{

        if(1 == n)
        {
                printf("第%d次移到:把%c上的移到%c上\n",++cnt,a,c);
        }

        else
        {
                hnt(a,c,b,n-1);
                printf("第%d次移到:把%c上的移到%c上\n",++cnt,a,c);
                hnt(b,a,c,n-1);

        }
}
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值