如果n=5;其中后面的一部分子集按顺序排是这样的:
{5}
{1 5}
{2 5}
{3 5}
{4 5}
{1 4 5}
{2 4 5}
{3 4 5}
{1 3 4 5}
{2 3 4 5}
{1 2 3 4 5}
我们可以把一个子集看成两个部分,一部分是前面的追赶者,另一部分是后面的累积者。
{1 5},{2 5},{3 5},{4 5}就像这些子集,追赶者从1一直追赶到了4,然后与累积者{5}相遇,累积者变成{4 5};追赶者从头继续从1一直追赶到了3,然后与累积者{4 5}相遇,累积者变成{3 4 5};如此反复,可以把这个全部输出来。
而累积者始终是连续的,比如{4 5}、{3 4 5}、{2 3 4 5},所以我们只用定义累积者的头和尾,就可以把累积者的范围定义。
代码如下,仅供参考:
#include <stdio.h>
void main( void )
{
int n,i,runner,start,end
printf("请输入正整数n的值:")
scanf("%d",&n)
printf("{}\n") //空集必定是有的
for(end=1end<=nend++) //累积者的尾加一,直到n
{
printf("{%d}\n",end)
for(start=endstart>0start--) //累积者的头减一,直到1
{
for(runner=1runner<startrunner++) //追赶者加一,直到遇到累积者的头
{
printf("{")
printf("%d ",runner) //输出追赶者
for(i=starti<endi++)
printf("%d ",i) //输出累积者(不包括头,因为累积者的尾后面不跟空格,而是跟})
printf("%d}\n",end) //输出累积者的尾
}
}
}
}
代码集合就是把某些代码写到一个起名字的符合一定规范的代码块中,其中包括自定义的,也包括系统提供给我们的,比如下面的:让出协程(线程)。
当 C 函数调用了 lu a_yieldk, 当前运行的协程会挂起, 启动这个线程的 lu a_resume 调用返回。 参数 nresults 指栈上需返回给 lu a_resume 的返回值的个数。
当协程再次被延续时, Lu a 调用延续函数 k 继续运行被挂起()的 C 函数。 延续函数会从前一个函数中接收到相同的栈, 栈中的 n 个返回值被移除而压入了从 lu a_resume 传入的参数。 此外,延续函数还会收到传给 lu a_yieldk 的参数 ctx。
通常,这个函数不会返回; 当协程一次次延续,将从延续函数继续运行。 然而,有一个例外: 当这个函数从一个逐行运行的钩子函数) 中调用时,lu a_yieldk 不可以提供延续函数。 (也就是类似 lu a_yield 的形式), 而此时,钩子函数在调用完让出后将立刻返回。 Lu a 会使协程让出,一旦协程再次被延续, 触发钩子的函数会继续正常运行。
当一个线程处于未提供延续函数的 C 调用中,调用它会抛出一个错误。 从并非用延续方式(例如:主线程)启动的线程中调用它也会这样。
这个函数等价于调用 l ua_yieldk, 不同的是不提供延续函数()。 因此,当线程被延续,线程会继续运行调用 l ua_yield 函数的函数。
返回保存在 Lua 内核中储存的版本数字的地址。 当调用时传入一个合法的 l。a_State , 返回创建该状态机时的版本地址。 如果用 NULL 调用, 返回调用者的版本地址。
把给定索引处的值转换为一般的 C 指针 (void*) 。 这个值可以是一个用户对象,表 ,线程或是一个函数; 否则, lu a_topointer 返回 NULL 。 不同的对象有不同的指针。 不存在把指针再转回原有类型的方法。
lu a_tolstring 返回一个已对齐指针 指向 L ua 状态机中的字符串。 这个字符串总能保证 ( C 要求的)最后一个字符为零 ('\0') , 而且它允许在字符串内包含多个这样的零。
因为 Lu a 中可能发生垃圾收集, 所以不保证 lu a_tolstring 返回的指针, 在对应的值从堆栈中移除后依然有效。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)