1.给递归函数一个明确的语义信息 即fn具体代表了什么
2.设计边界条件 就是n==1时候 f(n)=?
3.假设我们的递归函数是正确的,来设计本层的设计 即写出fn的关系式
1.这里的f(n)代表了能吃n天的桃子数量
2.n==1----->1
3.(f(n-1)+1)*2=f(n)
顺序表和链表
数据结构=结构定义+结构操作
一、顺序表
顺序表的结构定义:1.一段连续的存储区(这里的连续用指针来实现) 2.一个整型的变量来标记我们数组的长度大小 3.也是一个整型的变量来标记我们存储了几个数据
和数组类似 但是多了两个属性size count
顺序表的结构操作:插入or 删除
顺序表因为是连续的所以在插入或者删除的操作过程中需要对后面的元素进行存储空间的移动
代码演示:
数据结构就是定义一种性质然后去维护这种性质
实在是大多了参考代码吧
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef struct vector
{
int size, count;
int* date;
}vector;//这是结构定义
//结构操作 1.初始化操作
vector* getNewVector(int n)
{
vector* p = (vector*)malloc(sizeof(vector));
p->size = n;
p-> count = 0;
p->date = (int *)malloc(sizeof(vector));
return p;
}
//2.销毁操作
void clear(vector* v)
{
if (v == NULL) return;
free(v->date);
free(v);
return;
}
//扩容操作
int expand(vector* v)
{
if (v == NULL) return 0;
printf("expand v ");
v->date = (int*)realloc(v->date, sizeof(int) * 2 * v->size);
v->size *= 2;
return 1;
}
//3.顺序表的插入操作
int insert(vector* v, int pos, int val)
{
if (pos < 0 || pos > v->count) return 0;
//先要判断size==count 判断还有没有空间 能否插入进去
if (v->size == v->count && !expand(v)) return 0;//顺序表满了并且扩容操作不成功
if (v->size == v->count) return 0;
for (int i = v->count - 1; i >= pos; i--)//这个很关键 用的是i--逆序遍历 如果正着的话会有元素覆盖
{
v->date[i + 1] = v->date[i];
}//完成了pos以后的元素向后移动的操作为pos 腾出了一块空间
v->date[pos] = val;//进行插入
v->count += 1;//数据结构就是定义一种性质然后去维护这种性质 ,这里就是维护的部分
return 1;
}
void output_vector(vector* v)
{
printf("\n");
int len = 0;
for (int i = 0; i < v->size; i++)
{
len += printf("%3d", i);
}
printf("\n");
for (int i = 0; i < len; i++)
{
printf("-");
}
for (int i = 0; i < v->size; i++)
{
printf("%3d", v->date[i]);
}
printf("\n");
return;
}
//下面是数据表的删除操作
int erase(vector* v, int pos)
{
if (pos < 0 || pos >= v->count) return 0;
for (int i = pos + 1; i < v->count; i++)//进行删除的操作,用正序进行直接覆盖
{
v->date[i - 1] = v->date[i];
}
v->count -= 1;
return 1;
}
int main()
{
srand(time(0));
#define MAX_OP 20
vector* v = getNewVector(2);
for (int i = 0; i < MAX_OP; i++)
{
int op = rand() % 4, pos, val;
switch (op)
{
case 0:
case 1:
case 2:
pos = rand() % (v->count + 2);
val = rand() % 100;
printf("insert %d at %d to vector = %d\n", val, pos, insert(v, pos, val));
break;
case 3:
pos = rand() % (v->count + 2);
printf("erase item at %d in vector = %d\n", pos, erase(v, pos));
break;
}
output_vector(v);
}
return 0;
}