C语言中递归详解

     编写一个简单的cheng函数,输入的b全为数值5。

第一种情况:

  1 #include<stdio.h>
  2 int cheng(int a)
  3 {
  4 
  5     if(a>1)
  6     {
  7         a=a*cheng(a-1);
  8     printf("%d\n",a);
  9     }
 10     return a;
 11 }
 12 
 13 int main()
 14 {
 15     int b,c;
 16     scanf("%d",&b);
 17     c=cheng(b);
 18     printf("%d",c);
 19 }

这种情况会输出:

2
6
24
120
120

       为什么会产生这样的结果?

       首先我们要明白,函数在未完成自己的计算之前,是无法被调用的。所以在做递归运算时,实际上是从最后一个值开始计算的,而不是我们所输入的初始值5。所以,当a=1的时候,不会进入到 if 里面去,程序会直接把 1 传递给上一个cheng(a-1),上一个a=2*1=2会直接打印出来,然后传递给上一层,a=3*2=6会被打印,然后再是a=4*6=24,最后是a=5*24=120被打印出来。

       接下来我们做一些简单的改变(以下改变均在初始程序上进行改变,不叠加):if(a>1)改为if(a>=1)。

0
0
0
0
0
0

输出结果为6个0;因为当a=0能够进入if后,第一层就变为a=a*0=0,一直往上面传递,a的值会一直不变为0。

       把if(a>1)改为if a(>2),产生的结果为:

6
24
120
120

只输出4个数,因为a=2不进入if,第一层为a=3*2=6依次往上传递。

       把if后面的{}去掉,让if只控制一条程序。此时输出的结果为:

1
2
6
24
120
120

这种情况下,虽然a=1不进入if,但是它能被输出来。

       把return a改为return 10这时的输出结果是:

20
30
40
50
10

为什么会产生这样的结果,首先,我们要明白,return返回的是函数的值,并不是改变a的值,所以最后输出的c为10。在cheng这个函数之中,第一层,a=2;a=a*10=20;上一层30;然后分别是40,50。

 

 

  • 63
    点赞
  • 137
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
Hanoi塔是一个经典的归问题,它可以用C语言来实现。Hanoi塔问题的规则是,有三根柱子A、B、C,以及n个不同大小的圆盘,初始时,所有圆盘都放在柱子A上,目标是将所有圆盘从A柱子移动到C柱子上,每次只能移动一个圆盘,并且大的圆盘不能放在小的圆盘上面。 要解决Hanoi塔问题,可以使用归的方法。归的思想是将大问题分解成一个个小问题来解决,然后通过组合小问题的解来解决整个问题。 在这个问题,我们可以将n个圆盘的移动分解为三个步骤: 1. 将n-1个圆盘从A柱子移动到B柱子上; 2. 将最大的一个圆盘从A柱子移动到C柱子上; 3. 将n-1个圆盘从B柱子移动到C柱子上。 这样,问题就被分解成了三个小问题,而这三个小问题与原问题的规模相比减小了,因此可以使用归的方法来解决。 具体的C语言归代码如下: ```c void hanoi(int n, char source, char auxiliary, char target) { if (n == 1) { // 只有一个圆盘时,直接从source柱子移动到target柱子上 printf("Move disk from %c to %c\n", source, target); return; } hanoi(n-1, source, target, auxiliary); // 归调用步骤1 printf("Move disk from %c to %c\n", source, target); // 移动最大的圆盘 hanoi(n-1, auxiliary, source, target); // 归调用步骤3 } int main() { int n; printf("Enter the number of disks: "); scanf("%d", &n); hanoi(n, 'A', 'B', 'C'); // 调用归函数 return 0; } ``` 通过上述C语言代码,我们可以归地解决Hanoi塔问题,并输出每一步的移动方式。这个归方法的时间复杂度是O(2^n),因为每个圆盘都要移动2^n次。但是由于归的特性,它的空间复杂度是O(n),因为每次归调用时需要保存函数的局部变量。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值