递归算法的应用:
1.共有n级台阶,某人一次走一级或两级,问此人走完n级台阶共有多少种走法?
C实现
#include <stdio.h>
int recursion(int n){
int steps[100]={0};
steps[1]=1;
steps[2]=2;
int i=0;
if(n==1) return steps[1];
else if(n==2) return steps[2];
else
for(i=3;i<=n;i++){
steps[i]=steps[i-1]+steps[i-2];
}
return steps[n];
if(n==1) return 1;
else if(n==2) return 2;
else return recursion(n-1)+recursion(n-2);
}
int main(){
int n,sum=0;
printf("请输入台阶级数\n");
scanf("%d",&n);
sum=recursion(n);
printf("sum=%d\n",sum);
return 0;
}
附:C++实现
#include <iostream>
using namespace std;
void Circul(const int n);
int main(){
int n;
cout << "请输入台阶级数."<<endl;
cin >>n;
Circul(n);
return 0;
}
void Circul(const int n){
int i;
int a[100];
a[1]=1;
a[2]=2;
a[3]=3;
if(n==1){
cout <<a[1]<<endl;
return;
}else if(n==2){
cout <<a[2]<<endl;
return;
}/*else if(n==3){
cout <<a[3]<<endl;
return;
}*/else
for(i=4;i<=n;i++){
a[i]=a[i-2]+a[i-1];
}
cout<< a[n] <<endl;
}
//判断一个数是否回文
#include <stdio.h>
int main(){
int num;
int sum=0,temp=0;
printf("请输入一个整数:\n");
scanf("%d",&num);
temp=num;
while(num){
sum=sum*10+num%10;
num/=10;
}
if(temp==sum)
printf("是回文数\n");
else
printf("不是回文数\n");
return 0;
}
有n个人,站成一圈,每个人都有编号,开始报数,3倍数的人离开这个圈,问最后剩下的一个人是几号(编号)
#include <stdio.h>
#include <stdlib.h>
struct Num{
int num;
struct Num *next;
}*head=NULL,*tail,*p,*p1;
int main(){
int n=0;
printf("请输入总人数:\n");
scanf("%d",&n);
//创建环状链表
int i=0;
for(i=0;i<n;i++){
p=(struct Num *)malloc(sizeof(struct Num));
p->next=NULL;
p->num=i+1;
if(head==NULL)/*尾插*/
head=p;
else
tail->next=p;
tail=p;
}
tail->next=head;//连成环
//报数
p=head;//从首节点开始报数
i=1;
while(p!=p->next){
if(i%3==0){
p1->next=p->next;//(释放前)把当前要释放节点的下一个节点的地址保存到当前节点的前一个节点(p1)
free(p);
p=p1->next;//新的p
}
else{
p1=p;//当前节点向后偏移
p=p->next;
}
i++;
}
printf("p->num=%d\n",p->num);
return 0;
}
~