数据结构6(自用)

本文深入探讨了递归的概念,包括其定义、基本条件和与循环的区别。通过阶乘、数列求和、汉诺塔等例子展示了递归的应用,并提供了相应的代码实现。递归虽然理解起来直观,但可能导致速度较慢和存储需求增大。此外,递归在树和图的算法以及数学公式定义中具有重要地位。
摘要由CSDN通过智能技术生成

递归:

   定义:有关函数自己直接或间接调用自己

   递归要满足的三个条件:1、必须有一个明确的终值条件

                                           2、该函数所处理的数据规模在递减

                                           3、这个转化必须是可解的

   循环和递归:所有循环可以解决的递归也可以,but反过来不行。

                         递归:易理解, 速度慢,存储空间大

                         循环:不易理解,速度快,存储空间小

   举例:1、求阶乘

              2、求1+2+3+4+。。。+100

              3、汉诺塔

              4、走迷宫

    递归的应用:1、树和森林就算以递归的方式定义的

                          2、树和图的好多算法都是以递归来实现的

                          3、好多数学公式就是以递归的方式定义的:eg 斐波拉契序列  1、2、3、5、8、                                                                                                                              13、21、34......

              

void f(int n)

{

 if(n == 1)

 printf("哈哈\n");

else

f(n-1);

}

当n=0时,不会输出哈哈。n=else;输出一个哈哈。

//假定n的值时1或者大于1的值(求阶乘)

long f(long n)

{

 if(1 == n);

       return 1;

else

       return f(n-1)*n;     //求和只需要把 * 改成+

}

汉诺塔:

if(n>1)

{

先把A柱子上的前n-1个盘子借助C移到B,

将A柱子上的第n个盘子直接移到C,

再将B柱子上的n-1个盘子借助A直接移到C,

}

以此类推,再将B上的n-2个借助C移到A,将第n-1个直接移到C

 问题:怎么将前n-1移到B。 

#include<stdio.h>

void hannuota(int n, char A, char B, char C)

{

 if(1 == n)

printf("将编号为%d的盘子直接从%c移到%c柱子\n",n, A,C);

else

{

hannuota(n-1,A,C,B);

printf("将编号为%d的盘子直接从%c移到%c柱子\n",n, A,C);

hannuota(n-1,B,A,C);

}

}

int main(void)

{

char ch1 = 'A';

char ch2 = 'B';

char ch3 = 'C';

int n;

printf("please input the amount of plants:");

scanf("%d", &n);

hannuota(n,'A','B','C');

return 0;

}

注:n=1, 1次

       n=2     3次

       n=3     7次

      。。。

       n=64     2^64-1(这是一个天文数字,就算世界上最快的计算机也解决不了)

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值