走楼梯问题:
有n阶台阶,每次只可以走1阶或2阶,有多少中走法?
可以用递归实现:
如果对递归比较的熟悉的话,可以很快将递归的代码转化成非递归的;
#include "stdio.h"
#include "1.h"
int count = 0;
int count2 = 0;
//将上面的递归的改成用栈来实现!
void result3 (int n,int i) {
if (i>=n) {
count++;
}else {
result3(n,i+1);
result3(n,i+2);
}
}
//求栈的和值
int sum (LinkStack &list) {
int sum = 0;
LinkStack p = list;
while (p!=NULL) {
sum = sum + p->data;
p = p->next;
}
return sum;
}
//第一部压入1的情况n;
//第二部压入2的情况n-1;
void result1 (int n) {
LinkStack stack = NULL;
int temp;;
push(stack,1);
while (stack!=NULL) {
while (sum(stack)< n) {
push(stack,1);
}
if (sum(stack) ==n) {
count2++;
}
if ((getTop(stack) ==1)&&(getTop2(stack)==1)) {
pop(stack,temp);
pop(stack,temp);
}else if (getTop(stack)==1&&getTop2(stack)==2) {
pop(stack,temp);
pop(stack,temp);
while (getTop(stack) == 2) {
pop(stack,temp);
}
pop(stack,temp);
}else if (getTop(stack)==2) {
pop(stack,temp);
while (getTop(stack) ==2) {
pop(stack,temp);
}
pop(stack,temp);
}
if (stack!=NULL) {
push(stack,2);
}
}
}
//n还是台阶数
void result2 (int n) {
result1(n);
result1(n-1);
}
void main () {
LinkStack stack = NULL;
printf("递归的算法的结果:\n");
result3(10,1);//递归算法
printf("%d\n",count);
result2(10);//非递归算法
printf("非递归的算法的结果是:\n");
printf("%d\n",count2);
return;
}
1.h文件是:
#include "stdio.h"
#include "stdlib.h"
typedef int ElemType;
typedef struct StackList {
struct StackList *next;
ElemType data;
}StackList,*LinkStack;
void push (LinkStack &l,ElemType e) {
LinkStack q = (LinkStack)malloc(sizeof(StackList));
q->data = e;
q->next = l;
l = q;
}
int getTop(LinkStack s) {
if (s==NULL) {
return -1;
}
return s->data;
}
int getTop2 (LinkStack &s) {
if (s==NULL) {
return -1;
}
if (s->next!=NULL) {
return s->next->data;
}
return -1;
}
void toString (LinkStack s) {
if (s == NULL) {
printf("是空的栈");
return;
}
printf("栈中的元素从栈顶到栈尾依次是:\n");
while (s!=NULL) {
printf("%d\n",s->data);
s = s->next;
}
}
void pop(LinkStack &s,ElemType &e) {
if (s == NULL) {
return;
}
LinkStack l = s;
s = s->next;
e = l->data;
free(l);
}
运行的结果是:
递归的算法的结果:89;
非递归的算法的结果:89;
一般情况下:递归的算法也可以转化成用迭代来解;