小编noe*_*ein的帖子

提示了解解决皇后区精彩计划的方法

在Sterling&Shapiro 的序言艺术中,练习14.1(v)节:

queens(N,Qs) :-
    length(Qs,N),
    place_queens(N,Qs,_,_).

place_queens(0,_Qs,_Ups,_Downs).
place_queens(I,Qs,Ups,[_|Downs]) :-
    I > 0, I1 is I-1,
    place_queens(I1,Qs,[_|Ups] ,Downs),
    place_queen(I,Qs,Ups,Downs).

place_queen(Q,[Q|_],[Q|_],[Q|_]).
place_queen(Q,[_|Qs],[_|Ups],[_|Downs] ):-
    place_queen(Q,Qs,Ups,Downs).
Run Code Online (Sandbox Code Playgroud)

这是一个出色的程序,共有11行,可快速解决将皇后放在棋盘上的问题。这很神奇:只有计数器,递归和列表变得越来越长。我,即使在跟踪的帮助下,也不了解它。有人可以向我解释吗?您如何编写这样的程序?导致从(例如,另一个)(好的标准解决方案)派生该程序的逻辑/心理过程是什么?

queens(N,Qs) :-
    numlist(1,N,Ns), 
    queens(Ns,[ ],Qs).

queens(UnplacedQs,SafeQs,Qs) :-
    select(Q,UnplacedQs,UnplacedQs1),
    \+ attack(Q,SafeQs),
    queens(UnplacedQs1,[Q|SafeQs] ,Qs).
queens([ ],Qs,Qs).

attack(X,Xs) :-
    attack(X,1,Xs).

attack(X,N,[Y|_]) :-
    X is Y+N ; X is Y-N.
attack(X,N,[_|Ys]) :-
    N1 is N+1,
    attack(X,N1,Ys).
Run Code Online (Sandbox Code Playgroud)

prolog n-queens

10
推荐指数
1
解决办法
307
查看次数

Rebol 中用于列表理解的“编译器”

我想编译这个列表理解:

>> lc [reduce [x y] | x in [1 2 3] y in [4 5 6]]
== [[1 4] [1 5] [1 6] [2 4] [2 5] [2 6] [3 4] [3 5] [3 6]]
Run Code Online (Sandbox Code Playgroud)

在:

collect [
   foreach x [1 2 3] [
       foreach y [4 5 6] [
           keep/only reduce [x y]]]]
Run Code Online (Sandbox Code Playgroud)

或者:

>> lc [reduce [x y] | x in range [1 5] y in range reduce[1 x] if x + y > 4]
== [[3 …
Run Code Online (Sandbox Code Playgroud)

dsl list-comprehension rebol red

0
推荐指数
1
解决办法
238
查看次数

标签 统计

dsl ×1

list-comprehension ×1

n-queens ×1

prolog ×1

rebol ×1

red ×1