第五天:C基础之递归与二维数组

写递归函数时要明确结束条件和递归体。

练习了几个递归函数:

首先是斐波那契数,前几天写过的程序,今天写的时候还是出现了问题。在判断结束条件的时候写错。写成(i==1&&i==2) 这个是有明显的逻辑错误。

 1 斐波那契#include<stdio.h>
 2 int fbnq(int i)
 3 {
 4     if(i==1)
 5         return 1;
 6     if(i==2)
 7         return 1;
 8     int ret =  fbnq(i-1)+fbnq(i-2);
 9
10     return ret;
11
12
13 }
14
15 int main()
16 {
17     int num = 20;
18     int ret = fbnq(num);
19
20     printf("%d\n",ret);
21
22 }

斐波那契

写汉诺塔函数时,开始没有明白,递归就是看着代码简单。想要还原过程的话还是挺抽象的。

 1 #include<stdio.h>
 2 int move(int n,char src,char dest)
 3 {
 4     printf("%d from %c to %c \n",n,src,dest);
 5
 6 }
 7 int hano(int n ,char src ,char dest,char mid)
 8 {
 9     if( n ==1)
10     {
11         move(n,src,dest);
12         return 1;
13     }
14     hano(n-1,src,mid,dest);
15     move(n,src,dest);
16     hano(n-1,mid,dest,src);
17
18
19 }
20
21 int main()
22 {
23     hano(5,‘A‘,‘C‘,‘B‘);
24
25 }

汉诺塔

总结下,写递归函数时,要先找到递归函数的结束条件 。然后找规律,找出上一条件时的情况。到最后逆着推导。

 1 #include<stdio.h>
 2 int hello(int i[3])
 3 {
 4     printf("sizeof(i) == %d\n",sizeof(i));
 5
 6
 7 }
 8
 9 int main()
10 {
11     int arr[3] = {5,3,7};
12     hello(arr);
13
14     printf("sizeof(arr) == %d\n",sizeof(arr));
15
16 }

上面的代码中 ,结果为 sizeof(i) = 4 ; sizeof(arr) = 12;   当数组作为参数时,实际上是传首地址,既当作指针使用

 1 #include<stdio.h>
 2 int add(int (*n)[3])
 3 {
 4
 5
 6     int i ,j;
 7     int sum =0;
 8     for(i=0;i<2;i++)
 9         for(j=0;j<3;j++)
10             sum +=*(*(n+i)+j);
11     printf("%d\n",sum);
12
13
14
15 }
16 int main()
17 {
18     int br[2][3] = {{2,3,4},{6,4,1}};
19
20     int (*p)[3] = br;
21     add(p);
22
23 }

二维数组要传递首地址  使用的是数组指针  (*p)[n]    如果不加括号为指针数组  *p[n]  区别两者的概念,看最后两个,如果是数组指针,那就是指针变量,它希望存数组的首地址。

下面是一个有趣的代码  如果能够理解清楚 那么这两个概念就能够掌握了。

 1 #include<stdio.h>
 2
 3 int main()
 4 {
 5         short (*s)[4][3][2];
 6         printf("%d\n",sizeof(s));
 7         printf("%d\n",sizeof(s[0]));
 8         printf("%d\n",sizeof(s[0][0]));
 9         printf("%d\n",sizeof(s[0][0][0]));
10         printf("%d\n",sizeof(s[0][0][0][0]));
11 //      printf("%d\n",sizeof(s[0][0][0][0][0]));
12
13 }
14 ~  

结果为 4 48 12 4 2

 1 #include<stdio.h>
 2
 3 int main()
 4 {
 5     short s[4][3][2];
 6     printf("%d\n",sizeof(s));
 7     printf("%d\n",sizeof(s[0]));
 8     printf("%d\n",sizeof(s[0][0]));
 9     printf("%d\n",sizeof(s[0][0][0]));
10 //    printf("%d\n",sizeof(s[0][0][0][0]));
11 //    printf("%d\n",sizeof(s[0][0][0][0][0]));
12
13 }

输出结果为 48 12 4 2

下一个函数是求出整型数组的最大值,并打印出坐标

 1 #include<stdio.h>
 2 int search(int (*p)[3],int *x ,int *y)
 3 {
 4
 5     int max = 0;
 6     int i,j;
 7     for(i=0;i<2;i++)
 8         for(j=0;j<3;j++)
 9             {
10                 if(*(*(p+i)+j)>max)
11                     {
12                         max = *(*(p+i)+j);
13                         *x=i;
14                         *y=j;
15                     }
16             }
17     return max;
18 }
19
20 int main()
21 {
22     int arr[2][3] = {{1,2,3},{5,4,1}};
23
24     int (*p)[3] = arr;
25     int max ;
26     int x ,y;
27     max = search(p,&x,&y);
28     printf("%d,%d,%d\n",max,x,y);
29
30 }

这个没有什么难度 ,还有升级版本的题目,在一次循环内找出最大的两位;

#include<stdio.h>

int main()
{
    int arr[10] = {1,28,3,57,5,0,6,8,24,12};

    int i;
    int max = *(arr+1);
    int secondmax = *(arr + 0);
    int temp = 0;
    for(i=2;i<10;i++)
    {
        if( secondmax > max)
            max = secondmax;
        if(*(arr+i)>max)
            max = *(arr+i);
        else if(*(arr+i)>secondmax)
            secondmax =*(arr+i);

    }
    printf("%d,%d\n",secondmax,max);

}

找最大的两位

这个程序还有个错误 ,还没有改,就是判断 前两个值的时候,应该是max和secondmax交换值,而不是secondmax的值把max值给覆盖了。要是刚开始secondmax是最大值,而max是第二大的值,那么结果就会出错 。至于交换值的三种方法。我前面日志有写,就不提了。

最后是作业。主要是增加对二维数组的了解

 1 #include<stdio.h>
 2
 3 int main()
 4 {
 5     int arr[2][3] = {{2,3,5},{3,5,6}};
 6     int brr[3] = {0};
 7     int crr[2] = {0};
 8
 9     int i,j;
10     for(i=0;i<3;i++)
11     {
12         brr[i] = *(*(arr+0)+i) + *(*(arr+1)+i);
13         printf("%d ",brr[i]);
14     }
15     printf("\n");
16     for(i=0;i<2;i++)
17     {
18         for(j=0;j<3;j++)
19         {
20         crr[i] += *(*(arr+i)+j);
21
22         }
23         printf("%d ",crr[i]);
24     }
25
26
27 }

横竖求和

#include<stdio.h>

int main()
{
    int arr[2][3] = {{2,3,5},{3,5,6}};
    int brr[3][2] = {0};

    int i ,j;
    for(i=0;i<3;i++)
        for(j=0;j<2;j++)
            {
                *(*(brr+i)+j) = *(*(arr+j)+i);
                printf("%d ",*(*(brr+i)+j));
            }

}

转置二维数组

还有一个杨辉三角:

时间: 2024-11-20 20:53:15

第五天:C基础之递归与二维数组的相关文章

Python学习笔记 之 递归、二维数组顺时针旋转90&#176;、正则表达式

递归.二维数组顺时针旋转90°.正则表达式 1.   递归算法是一种直接或间接调用自身算法的过程. 特点: 递归就是在过程或函数里调用自身 明确的递归结束条件,即递归出口 简洁,但是不提倡 递归次数多容易造成栈溢出 要求: 每次调用递归规模上有所减小 前一次为后一次做准备 规模较小时必须直接给出解答而不再进行递归调用 例子:递归实现二分法 1 def searchMyData(mydate,a1): 2 mid = int(len(mydate)/2) 3 if mid >= 1: 4 if m

Java基础---Java中的二维数组(三十四)

Java 中的二维数组 所谓二维数组,可以简单的理解为是一种"特殊"的一维数组,它的每个数组空间中保存的是一个一维数组. 那么如何使用二维数组呢,步骤如下: 1. 声明数组并分配空间 或者 如: 2. 赋值 二维数组的赋值,和一维数组类似,可以通过下标来逐个赋值,注意索引从 0 开始 也可以在声明数组的同时为其赋值 如: 3. 处理数组 二维数组的访问和输出同一维数组一样,只是多了一个下标而已.在循环输出时,需要里面再内嵌一个循环,即使用二重循环来输出二维数组中的每一个元素.如: 运行

Python 迭代器&amp;生成器,装饰器,递归,算法基础:二分查找、二维数组转换,正则表达式,作业:计算器开发

本节大纲 迭代器&生成器 装饰器  基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果,结果必须与真实的计算器所得出的结果一致 迭代器&

[java学习笔记]java语言基础概述之数组的定义&amp;常见操作(遍历、排序、查找)&amp;二维数组

1.数组基础 1.什么是数组:           同一类型数据的集合,就是一个容器. 2.数组的好处:           可以自动为数组中的元素从零开始编号,方便操作这些数据. 3.格式:  (一旦创建,必须明确长度)          格式1:              元素类型   [ ]  数组名  =  new  元素类型  [元素个数即数组的长度]:              示例:int[] array = new int[5];          格式2:           

JavaSE7基础 遍历二维数组 for循环

版本参数:jdk-7u72-windows-i586注意事项:博文内容仅供参考,不可用于其他用途. 代码 class Demo{ public static void main(String[] args){ //该二维数组有三个不同长度的一维数组. int[][] myArr={ {1,2,3,4}, {4,5,6}, {1,23,45,67,66} }; printArray2(myArr); } public static void printArray2(int[][] myArray)

利用递归把多维数组转为一维数组的函数

函数名称:array_multi2single 函数原形:array array_multi2single(array) 实现功能:把一个多维数组的数值存放到一维数组中,不保存Key. < ?php function array_multi2single($array) {     static $result_array=array();     foreach($array as $value)     {         if(is_array($value))         {    

蓝鸥Unity开发基础—— 二维数组学习笔记

蓝鸥Unity开发基础-- 二维数组学习笔记 一.二维数组 有两个下标的数组叫做二维数组 类似[,]数组名=new类型[常量表达式1,常量表达式2] int[,] numbers= new int[2,3]; [0,0] [0,1] [0,2] [1,0] [1,1] [1,2] 举例说明 using System; namespace Lesson16{    class MainClass    {        public static void Main (string[] args)

JavaScript 递归法排列组合二维数组2

<html> <head> <title>二维数组排列组合</title> </head> <body> <div id="showDiv"></div> </body> <script type="text/javascript"> var arrays = [ [ '1-1-雨尘', '1-2-芸芸', '1-3-简一', '1-4-乐乐' ]

JavaScript 递归法排列组合二维数组

<html> <head> <title>二维数组排列组合</title> </head> <body> <div id="showDiv"></div> </body> <script type="text/javascript"> var arrays = [ [ '1-1-雨尘', '1-2-芸芸', '1-3-简一', '1-4-乐乐' ]