递归返回值部分的奥妙,递归十转二的疑惑,二维数组变换方阵的伎俩。

递归巩固:

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();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值