用尽量少的语句和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