33.递归

C语言中的函数可以递归调用,即函数可以直接或间接调用自身。

解决该问题有两种方法。一种方法是将生成的各个数字依次存储到一个数组中,然后再以相反的次序打印它们,这种方法与3.6节中itoa函数的处理方式相似。另一种方法则是使用递归,函数printd首先调用它自身打印前面的(高位)数字,然后再打印后面的数字。这里编写的函数不能处理最大的负数。

#include <stdio.h>

/*  printd函数:打印十进制n  */
void printd(int n)
{
	if(n < 0){
		putchar('-');
		n = -n;
	}
	if (n / 10)
	    printd(n / 10);
	    putchar(n % 10 + '0');
} 

从执行速度来讲。下列版本的快速排序函数可能不是最快的,但它是最简单的算法之一。在每次划分子集时,该算法总是选取各个子数组的中间元素。

/*  qsort函数:以递增顺序对v[left] …v[right]进行排序  */
void qsort(int v[], int left,int right)
{
	int i,last;
	void swap(int v[], int i,int j);
	
	if (left >= right)  /*  若数组包含的元素数少于两个  */
	    return;         /*  则不执行任何操作  */
	swap(v,left,(left + right)/2)  /*  将划分子集的元素  */
	last = left;                   /*  移动到v[0]  */
	for(i = left+1;i <=right;i++)     /*  划分子集  */
	   if (v[i] < v[left])
	       swap(v, ++last,i);
	swap(v,left,last);         /*  恢复划分子集的元素  */
	qsort(v,left,last-1);
	qsort(v,last+1,right); 
} 
/*  swap函数:交换v[i]与v[j]的值  */
void swap(int v[],int i,int j)
{
	int temp;
	
	temp = v[i];
	v[i] = v[j];
	v[j] = temp;
} 

练习4-12

#include <stdio.h>

/*Stat:founded in 2017.11.8*/
char *itoa(char *s,int n,int base)
{
   char *p,*q;
   unsigned number;


   q = "0123456789abcdefghijklmnopqrstuvwxyz";     /*有点小瑕疵:最后返回指针的逆序 (求修改)*/
   if(base == 0)
      base = 10;
   if(s == NULL || base < 2 || base > 36)
      return NULL;
   p = s;
   if(n < 0)
   {
      *p++ = '-';
 number = -n;
   }
   else
      number = n;
   if(number / base)
     p = itoa(p,number / base,base);
   *p = q[number % base];
   *(++p) = '\0';


   return p;
}


int main(void)
{
    char s[100];
    int n,b;


    while(scanf("%d%d",&n,&b))
    {
        itoa(s,n,b);
        printf("%s\n",s);
    }
    return 0;
}

练习4-13

#include <stdio.h>

int swap(char *s,char *p)
{
   int i = 0;
   char temp;


   if(*++p != '\0')
      i = swap(s,p);
   if((s+i) <= (--p))
   {
      temp = *(p);
      *(p) = *(s+i);
 *(s+i) = temp;
   }
   return ++i;
}


char *reverse(char *s)
{
   char *p,*q;


   q = p = s;
   swap(q,p);
   return s;
}


int main(void)
{
   char s[] = "I want eat fish!";


   printf("%s\n",reverse(s));
   return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java多线程递归可以通过创建多个线程来实现递归操作。具体实现方法如下: 1.创建一个继承Thread类的递归线程类,重写run()方法,在run()方法中实现递归操作。 2.在递归线程类中定义一个构造方法,用于传递递归参数。 3.在递归线程类中定义一个静态变量,用于记录递归深度。 4.在递归线程类中定义一个静态变量,用于记录递归线程数。 5.在递归线程类中定义一个静态变量,用于记录递归线程的最大数目。 6.在递归线程类中定义一个静态变量,用于记录递归线程的最大深度。 7.在递归线程类中定义一个静态变量,用于记录递归线程的最小深度。 8.在递归线程类中定义一个静态变量,用于记录递归线程的平均深度。 9.在递归线程类中定义一个静态变量,用于记录递归线程的总数。 10.在递归线程类中定义一个静态变量,用于记录递归线程的总时间。 11.在递归线程类中定义一个静态变量,用于记录递归线程的平均时间。 12.在递归线程类中定义一个静态变量,用于记录递归线程的最大时间。 13.在递归线程类中定义一个静态变量,用于记录递归线程的最小时间。 14.在递归线程类中定义一个静态变量,用于记录递归线程的总内存。 15.在递归线程类中定义一个静态变量,用于记录递归线程的平均内存。 16.在递归线程类中定义一个静态变量,用于记录递归线程的最大内存。 17.在递归线程类中定义一个静态变量,用于记录递归线程的最小内存。 18.在递归线程类中定义一个静态变量,用于记录递归线程的总CPU时间。 19.在递归线程类中定义一个静态变量,用于记录递归线程的平均CPU时间。 20.在递归线程类中定义一个静态变量,用于记录递归线程的最大CPU时间。 21.在递归线程类中定义一个静态变量,用于记录递归线程的最小CPU时间。 22.在递归线程类中定义一个静态变量,用于记录递归线程的总IO时间。 23.在递归线程类中定义一个静态变量,用于记录递归线程的平均IO时间。 24.在递归线程类中定义一个静态变量,用于记录递归线程的最大IO时间。 25.在递归线程类中定义一个静态变量,用于记录递归线程的最小IO时间。 26.在递归线程类中定义一个静态变量,用于记录递归线程的总网络时间。 27.在递归线程类中定义一个静态变量,用于记录递归线程的平均网络时间。 28.在递归线程类中定义一个静态变量,用于记录递归线程的最大网络时间。 29.在递归线程类中定义一个静态变量,用于记录递归线程的最小网络时间。 30.在递归线程类中定义一个静态变量,用于记录递归线程的总磁盘时间。 31.在递归线程类中定义一个静态变量,用于记录递归线程的平均磁盘时间。 32.在递归线程类中定义一个静态变量,用于记录递归线程的最大磁盘时间。 33.在递归线程类中定义一个静态变量,用于记录递归线程的最小磁盘时间。 34.在递归线程类中定义一个静态变量,用于记录递归线程的总锁时间。 35.在递归线程类中定义一个静态变量,用于记录递归线程的平均锁时间。 36.在递归线程类中定义一个静态变量,用于记录递归线程的最大锁时间。 37.在递归线程类中定义一个静态变量,用于记录递归线程的最小锁时间。 38.在递归线程类中定义一个静态变量,用于记录递归线程的总等待时间。 39.在递归线程类中定义一个静态变量,用于记录递归线程的平均等待时间。 40.在递归线程类中定义一个静态变量,用于记录递归线程的最大等待时间。 41.在递归线程类中定义一个静态变量,用于记录递归线程的最小等待时间。 42.在递归线程类中定义一个静态变量,用于记录递归线程的总等待数。 43.在递归线程类中定义一个静态变量,用于记录递归线程的平均等待数。 44.在递归线程类中定义一个静态变量,用于记录递归线程的最大等待数。 45.在递归线程类中定义一个静态变量,用于记录递归线程的最小等待数。 46.在递归线程类中定义一个静态变量,用于记录递归线程的总等待时间。 47.在递归线程类中定义一个静态变量,用于记录递归线程的平均等待时间。 48.在递归线程类中定义一个静态变量,用于记录递归线程的最大等待时间。 49.在递归线程类中定义一个静态变量,用于记录递归线程的最小等待时间。 50.在递归线程类中定义一个静态变量,用于记录递归线程的总等待数。 51.在递归线程类中定义一个静态变量,用于记录递归线程的平均等待数。 52.在递归线程类中定义一个静态变量,用于记录递归线程的最大等待数。 53.在递归线程类中定义一个静态变量,用于记录递归线程的最小等待数。 54.在递归线程类中定义一个静态变量,用于记录递归线程的总等待时间。 55.在递归线程类中定义一个静态变量,用于记录递归线程的平均等待时间。 56.在递归线程类中定义一个静态变量,用于记录递归线程的最大等待时间。 57.在递归线程类中定义一个静态变量,用于记录递归线程的最小等待时间。 58.在递归线程类中定义一个静态变量,用于记录递归线程的总等待数。 59.在递归线程类中定义一个静态变量,用于记录递归线程的平均等待数。 60.在递归线程类中定义一个静态变量,用于记录递归线程的最大等待数。 61.在递归线程类中定义一个静态变量,用于记录递归线程的最小等待数。 62.在递归线程类中定义一个静态变量,用于记录递归线程的总等待时间。 63.在递归线程类中定义一个静态变量,用于记录递归线程的平均等待时间。 64.在递归线程类中定义一个静态变量,用于记录递归线程的最大等待时间。 65.在递归线程类中定义一个静态变量,用于记录递归线程的最小等待时间。 66.在递归线程类中定义一个静态变量,用于记录递归线程的总等待数。 67.在递归线程类中定义一个静态变量,用于记录递归线程的平均等待数。 68.在递归线程类中定义一个静态变量,用于记录递归线程的最大等待数。 69.在递归线程类中定义一个静态变量,用于记录递归线程的最小等待数。 70.在递归线程类中定义一个静态变量,用于记录递归线程的总等待时间。 71.在递归线程类中定义一个静态变量,用于记录递归线程的平均等待时间。 72.在递归线程类中定义一个静态变量,用于记录递归线程的最大等待时间。 73.在递归线程类中定义一个静态变量,用于记录递归线程的最小等待时间。 74.在递归线程类中定义一个静态变量,用于记录递归线程的总等待数。 75.在递归线程类中定义一个静态变量,用于记录递归线程的平均等待数。 76.在递归线程类中定义一个静态变量,用于记录递归线程的最大等待数。 77.在递归线程类中定义一个静态变量,用于记录递归线程的最小等待数。 78.在递归线程类中定义一个静态变量,用于记录递归线程的总等待时间。 79.在递归线程类中定义一个静态变量,用于记录递归线程的平均等待时间。 80.在递归线程类中定义一个静态变量,用于记录递归线程的最大等待时间。 81.在递归线程类中定义一个静态变量,用于记录递归线程的最小等待时间。 82.在递归线程类中定义一个静态变量,用于记录递归线程的总等待数。 83.在递归线程类中定义一个静态变量,用于记录递归线程的平均等待数。 84.在递归线程类中定义一个静态变量,用于记录递归线程的最大等待数。 85.在递归线程类中定义一个静态变量,用于记录递归线程的最小等待数。 86.在递归线程类中定义一个静态变量,用于记录递归线程的总等待时间。 87.在递归线程类中定义一个

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值