【问题标题】:List of Nth prime numbers Prolog第 N 个素数列表 Prolog
【发布时间】:2016-09-22 17:17:41
【问题描述】:

我正在尝试学习 prolog,现在我正在尝试打印第 N 个素数的列表:

primes(N, N).
primes(N, F):-
    prime(F),
    write(F), nl,
    NewF is F + 1,
    primes(N, NewF).

primes(N):-
    primes(N, 2).

Prime/1 检查给定数字是否为素数。

primes(10) 的输出将是 2, 3,它应该是 2, 3, 5, 7,因为当 3 之后的 NewF(将是 4)不是素数时。所以它也不会执行 write(F) 也不会执行递归调用。我想知道如何解决这个问题,所以当它不是素数时它不会写 F 但之后仍会执行该部分。提前致谢!

【问题讨论】:

标签: recursion prolog


【解决方案1】:

我知道这个答案并不能完全回答 OP 问题(我的 getPrimeList(N, L) 创建一个列表 L,其中所有素数从零到 N;OP 要求第一个 N 素数)但是...只是为了好玩...我已经尝试实现 Eratosthenes 筛。

getListDisp(Top, Val, []) :-
  Val > Top.

getListDisp(Top, V0, [V0 | Tail]) :-
  V0 =< Top,
  V1 is V0+2,
  getListDisp(Top, V1, Tail).

reduceList(_, _, [], []).

reduceList(Step, Exclude, [Exclude | Ti], Lo) :-
  NextE is Exclude+Step,
  reduceList(Step, NextE, Ti, Lo).

reduceList(Step, Exclude, [H | Ti], [H | To]) :-
  Exclude > H,
  reduceList(Step, Exclude, Ti, To).

reduceList(Step, Exclude, [H | Ti], [H | To]) :-
  Exclude < H,
  NextE is Exclude+Step,
  reduceList(Step, NextE, Ti, To).

eratSieve([], []).

eratSieve([Prime | Ti], [Prime | To]) :-
  Step is 2*Prime,
  Exclude is Prime+Step,
  reduceList(Step, Exclude, Ti, Lo),
  eratSieve(Lo, To).

getPrimeList(Top, []) :-
  Top < 2.

getPrimeList(Top, [2 | L]) :-
  Top >= 2,
  getListDisp(Top, 3, Ld),
  eratSieve(Ld, L).

我再说一遍:不是真正的答案;只是为了好玩(作为OP,我正在尝试学习Prolog)。

【讨论】:

    【解决方案2】:

    您可以简单地添加子句:

    primes(N, F):-
        \+prime(F), nl,
        NewF is F + 1,
        primes(N, NewF).
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多