递归巩固:
1加到100,错误代码演示:
# include <stdio.h>
void main()
{
int count(int a);
int i = 99;
printf("\n%d",count(i));
getchar();
}
int count(int a)
{
int sum = 0;
sum += a;
if(a < 0)
{
count(--a);
}
return sum;
}
我=本意:用100作为实参,作为递归的起点,当实参小于0时,退出函数。
然后我发现这样写的结果是,函数返回的永远都是最初的实参,不能说最初,因为从始至终函数都没有开启过递归模式。
第一个错误:
每次进入函数时,sum都会初始化变为0,还累加个毛啊。
第二个错误
传入的实参是100,以a<0作为条件的if语句根本不会执行,还递归个毛啊。
所以结果就是参数怎么进去,就怎么出来。
这里就要理清楚,循环和递归的区别,循环体是写在函数里面的,所以可以将需要定义的变量写在循环体以外,然后就可以在循环体内实现连加,连乘等动作。但是函数里面需要用到的变量如果写在函数体内。递归模式开启后,每一次进入函数,里面所有的代码都会运行到,包括变量的定义和初始化。
然而递归的特别之处就在于,当递归模式开启后,返回值里会一直包含一个调用函数本身的指令,这个指令会一直存在到递归模式终止,才返回一个完全类型(int,float…)的返回值。方便说明,先附上正确的代码:
# include <stdio.h>
void main()
{
int count(int a);
int i = 100;
printf("\n%d",count(i));
getchar();
}
int count(int a)
{
if(a == 1)
{
return 1;
}else{
return a+count(a-1);
}
}
特别之处就在于retun a+count(a-1);可以这么理解,此时a+已经从函数中分离出来,下一次分离出来的是”(a-1)+”,直到终点时a =1;返回值编程5050,是一个纯粹的int型数据返回出去。
递归与循环的区别(我个人理解过后的形象记忆法):
循环的轨迹是一个直径不变的圆,
递归的轨迹是一个螺纹
那么我原始的思路能否行的通,其实是可以的。那就是利用全局变量来保存每次累加的和:
# include <stdio.h>
int sum = 0; //就像这样,放在外面就可以了
void main()
{
int count(int a);
int i = 100;
printf("\n%d",count(i));
getchar();
}
int count(int a)
{
sum += a;
if(a > 0)
{
count(a-1);
}
return sum;
}
关于十转二结果输出顺序的疑惑:
#include <stdio.h>
void main()
{ void tans(int i);
int i;
printf("请随机输入一个正整数:\t");
scanf("%d",&i);
getchar();
printf("\n对应的二进制数是:\t");
tans(i);
getchar();
}
void tans(int i)
{
if(i/2>0)
{
tans(i/2);
}
printf("%d",i%2);
}
//最初的疑惑,老觉得打印出来的应该是个倒的,经过百度网友的解析,彻悟:
tans(66)
{
tans(33)
{
tans(16)
{
tans(8)
{
tans(4)
{
tans(2)
{
tans(1)
{
printf("%d",1%2); \\此时1/2 == 0,递归结束,打印 1%2 = 1
}
printf("%d",2%2); \\0
}
printf("%d",4%2); \\0
}
printf("%d",8%2); \\0
}
printf("%d",16%2); \\0
}
printf("%d",33%2); \\1
}
printf("%d",66%2); \\0
}
//c从上往下输出结果为:100010 = 66 ,正确答案,再次强调代码是从上往下读的。理解万岁!
二维数组行列调换位置(行与列不相同)
#include <stdio.h>
void main()
{
int i = 0, j = 0;
int a[5][6],b[6][5];
printf("\n\n以下是随机生成的数组:\n");
for(i = 0;i<=4;i++)
{
for(j = 0;j <=5;j++)
{
a[i][j] = rand()%100+1;
printf("%d\t",a[i][j]);
if(j == 5)
{
printf("\n");
}
}
}
for(i = 0;i<=4;i++)
{
for(j = 0;j <=5;j++)
{
b[j][i] = a[i][j];
}
}
printf("\n变换队形后:\n");
for(i = 0;i<=5;i++)
{
for(j = 0;j <=4;j++)
{
printf("%d\t",b[i][j]);
if(j == 4)
{
printf("\n");
}
}
}
getchar();
}