用尽量少的语句和C语言关键字实现一个函数
/*
* 问题:
* 用尽量少的语句和C语言关键字实现函数:
* int print(int start, int count)
* 例如:
* print(2, 7) 的输出应该是:2 3 4 5 6 7 8 7 6 5 4 3 2。
* 即输出序列为:
* start, start + 1, ..., start + count - 1, ..., start + 1, start
*
* C:/> cl print.c
* C:/> print
* mlp: 2 3 4 5 6 7 8 7 6 5 4 3 2
* slp: 2 3 4 5 6 7 8 7 6 5 4 3 2
*
* 1)先考虑用多行的算法实现,然后想办法改写为单行的。这样有利于保证正确性。
* 2)最简单的算法是用循环,先递增打印 count 个,再递减打印。不过这样会用到
* for 等关键字,不能满足要求。代码比较简单,就不写了。
* 3)题目要求这么简洁的算法,就应该考虑用递归了。只有递归才有可能实现得比较
* 简洁。
* 结论:先用递归写一个多行的算法,然后改写。
*/
#include <stdio.h>
#include <assert.h>
/*
* 多行的递归算法:mlp = multiple-line-print
*/
int mlp(int start, int count)
{
/* 参数检查什么的 */
assert(count >= 0);
/* 递归的终止条件 */
if (count == 0)
return 0; /* 具体的返回值暂时无用,随便写一个。 */
printf("%d ", start);
/* 递归 */
/* 整数加减导致的溢出也不予考虑了 */
mlp(start + 1, count - 1);
/* 注意:这一行是在递归调用结束后执行的,它可以做到递减 */
if (count != 1) /* 最大的那个只打印一次 */
printf("%d ", start);
return 0; /* 具体的返回值暂时无用,随便写一个。 */
}
/*
* 单行的递归算法:slp = single-line-print
*
* 要把多行的代码直接转换为单行的代码,只能借助于 &&, || 这样的东西。
* (题目中不允许用 for,? :等)。
*/
int slp(int start, int count)
{
/* note:
* 标记的这行不能总是返回0,否则其后的 && 不执行了。
* 可以在 return 的数字后面加上任意一个大于 0 的数,使得 slp 即使在
* count 为 0 的时候也能够返回一个大于 0 的数(true)。
*/
return (
count
&& printf("%d ", start)
&& slp(start + 1, count - 1) /* note */
&& (count != 1 && printf("%d ", start))
)
+ 1;
}
int main(void)
{
printf("mlp: ");
mlp(2, 7);
printf("/n");
printf("slp: ");
slp(2, 7);
printf("/n");
return 0;
}
[
C
]
Written on July 11, 2007