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;
}