递归题目

来源:互联网 发布:2017最火的编程语言 编辑:程序博客网 时间:2024/06/07 12:14

    问题:47个人围成一圈,并依次编号(1--47),从第一个数到5那个人就淘汰,又从接下来的那个人开始从1数起,数到5的那个人被淘汰。。。。。。最后剩下的人是谁?(即刚开始的他的编号是多少)

    刚看到这个题目的时候,最先想到的应该是循环,在我想这也应该是人类思维最容易想到的,

#include<stdio.h>int taotai(int N,int k){        int man[1000];//存放猴子        int i,j=0,p;        for(i=0;i<N;i++)                man[i]=i+1;        for(i=0;i<N;i++)        {                p=0;                for(;p<k;)                {                        for(;man[j]==0;)                                j=(j+1)%N;                        p++;                        j=(j+1)%N;                }                j--;                if(j<0)                        j=N-1;                if(i==N-1)             return man[j];                man[j]=0;        }}int main(){        int N,k;        printf("pls input N,and k\n");        scanf("%d%d",&N,&k);        printf("the last left is :%d\n",taotai(N,k));        return 0;}

循环横容易理解,就是每次把淘汰的人所在数组元素标记为零,下次循环跳过元素为零的,最终就能得到那个最后淘汰的【有个缺点,就是浪费时间,应该能用链表完成,现在对链表不太熟悉,先用数组完成】

下面是运用递归完成:

#include<stdio.h>int taotai(int N,int k){// 每次运行都返回当前淘汰出来的位置int x;if(N==1)// 当剩下最后一个的时候他就是获胜者x=1;else {// 如果多余一个x=(taotai(N-1,k)+k)%N;// 继续从剩余的这些人中进行选取获胜(%n达到了循环的目的)(这里利用n-1时的淘汰位置加上k是下一个淘汰位置, 此时n又被减少)if(x==0)x=N;}return x;}int main(){int N,k;printf("pls input the total number and the skip number)\n");scanf("%d %d", &N, &k);printf("the one left:%d\n", taotai(N, k));return 0;}

递归和循环本质上是一样的,,,,可递归不太好理解

问题描述
菲波那契数列是指这样的数列:数列的第一个和第二个数都为 1,接下来每个数都
等于前面 2 个数之和。给出一个正整数 a,要求菲波那契数列中第 a 个数是多少。
输入数据
第 1 行是测试数据的组数 n,后面跟着 n 行输入。每组测试数据占 1 行,包括一个
正整数 a(1 <= a <= 20)。

输出要求
n 行,每行输出对应一个输入。输出应是一个正整数,为菲波那契数列中第 a 个数
的大小。
输入样例
4
5
2
19
1
输出样例
5
1
4181
1
解题思路:这个题目要求很明确,因为 a 的规模很小,所以递归调用不会产生栈溢
出的问题。设第 n 项值为 f(n),则 f(n) = f(n-1)+f(n-2)。已知 f(1)=1,f(2)=1,则从第3
项开始,可以用公式求。

比较简单,下面是我修改的:

#include<stdio.h>int f(int a){        if(a==1||a==2)return 1;        return f(a-1)+f(a-2);}int main(){        int n,i,a;        scanf("%d",&n);        for(i=0;i<n;i++)        {                scanf("%d",&a);                printf("%d\n",f(a));        }        return 0;
}


原创粉丝点击