递归与非递归习题

1.递归和非递归分别实现求第n个斐波那契数。 


 #include<stdio.h>
  
   int fib(int n)  
   {
   
      if(n<0)            //考虑n小于0;
      {
        return 0;
      }
      else
         {
          if(n==1)
            return 1;
           else if(n==2)
            return 1;
          else
            return fib(n-1)+fib(n-2);         //青蛙跳台阶问题是一样的解法 (只跳一节或两节台阶)
          }                                   //可以跳n节台阶 是2*fib(n-1)
 }
  int main()
  {
      int num = 0;
       int ret = 0;
     scanf("%d",&num);
    ret =  fib(num);
      printf("%d",ret);
      return 0;
  }
  #include<stdio.h>
   int fib(int n)
   {
     int f1 =1;
    int f2 = 1;
     int f3 = 0;
     int a = n-2;
       if(n<0)
      {
      return 0;
     }
     if((n==1)||(n==2))
       return 1;
 
      while(a--)
    {
        f3 = f1+f2;
       f1 = f2;
       f2 = f3;
   }
      return f3;
  }
  
  int main()
 {
     int num = 0;
    scanf("%d",&num);
     int ret = 0;
    ret = fib(num);
    printf("%d",ret);
    return 0;
  }

2.编写一个函数实现n^k,使用递归实现 

 #include<stdio.h>
  
   double cifang(int n , int k)
   {
   
     if(k==0)
      return 1;
      if(k>0)                //k是大于0的,小于0的话,容易溢出
    {
     if(k==1)
     return n;
    else
     {
       return n*cifang(n,k-1);
     }
    }
     return 0;
  }
  
  int main()
 {
      int num = 0;
      int k = 0;
      double ret = 0.0;
   scanf("%d %d",&num,&k);
     ret = cifang(num,k);
    printf("num = %lf\n",ret);
     return 0;
  }
  
3. 写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和,例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19 
#include<stdio.h>
   int sum(int num)
   {
      if(num>0)
      {
         if((num/10)==0)
          return num;
         else
           return (num%10+sum(num/10));    
     }
     return 0;
  }
  int main()
 {
    int num = 0;
    int ret = 0;
  scanf("%d",&num);
    ret = sum(num);
    printf("%d\n",ret);
   return 0;
  }
4. 编写一个函数reverse_string(char * string)(递归实现) 
实现:将参数字符串中的字符反向排列。 
要求:不能使用C函数库中 
的字符串操作函数。 

第一种不用递归方法:

 #include<stdio.h>
   #include<assert.h>
   #include<stdlib.h>
   #include<stddef.h>
   int my_strlen(char const *str)
   {
   
      assert(str!=NULL);
       int count = 0;
       while(*str++)
     {
           count++;
     }
      return count ;
  }
  char* reverse(char *str)
  {
  
      char *p1 = str;
       char *p2 = NULL;
       char  tmp = 0;
 
         p2 = str+my_strlen(str)-1;
         while(p1<p2)
  while(p1<p2)
      {
           tmp = *p1;
            *p1 = *p2;
            *p2 = tmp;
             p1++;
            p2--;
      }
       return str;
  }
 
  int main()
 {
      char *ret = NULL;
     char str[] = "abcdef";               //注意不能是字符串常量,他是不能改的如 char *str = "abcdef";
       ret = reverse(str);
    printf("%s\n",ret);
    return 0;
 }

第二种用递归:

  int my_strlen(char const *str)
   {
   
     if((*str)=='\0')
        return 0;
     else
      return 1+my_strlen(str+1);
  }
  void reverse(char *str)
 {  
	 
	  int len = my_strlen(str);
      assert(str!=NULL);
	  if(len<=1)
	  
		  return ;
	  else
	  {
		  char tmp = 0;
		  tmp = str[0];
		  str[0] = str[len-1];  
		  str[len-1] = '\0';
		  reverse(str+1);
		  str[len-1] = tmp;
	  }
  }
	  

	
  int main()
  {
    char str[] = "abcdef";
      reverse(str);
   printf("%s\n",str);
   system("pause");
     return 0;
  }
5.递归方式实现打印一个整数的每一位 
void print(int a)
{  
	    if(a==0)
	     return;
	    print(a/10);
	   printf("%d",a%10);
}
int main()
{
	int a = 1234;
      print(a);
	system("pause");
	return 0;
}



猜你喜欢

转载自blog.csdn.net/congjichukaishi/article/details/80294490