📜  Recaman 序列

📅  最后修改于: 2021-10-27 08:21:07             🧑  作者: Mango

给定一个整数 n。打印 Recaman 序列的前 n 个元素。
例子:

Input : n = 6
Output : 0, 1, 3, 6, 2, 7

Input  : n = 17
Output : 0, 1, 3, 6, 2, 7, 13, 20, 12, 21, 
         11, 22, 10, 23, 9, 24, 8

它基本上是与域和共域自然数和0。递归地定义如下的函数:
具体来说,让 a(n) 表示第 (n+1) 项。 (0 已经存在)。
规则说:

a(0) = 0,
if n > 0 and the number is not 
   already included in the sequence,
     a(n) = a(n - 1) - n 
else 
     a(n) = a(n-1) + n. 

下面是一个简单的实现,我们将所有 n 个 Recaman 序列号存储在一个数组中。我们使用上面提到的递归公式计算下一个数字。

C++
// C++ program to print n-th number in Recaman's
// sequence
#include 
using namespace std;
 
// Prints first n terms of Recaman sequence
int recaman(int n)
{
    // Create an array to store terms
    int arr[n];
 
    // First term of the sequence is always 0
    arr[0] = 0;
    printf("%d, ", arr[0]);
 
    // Fill remaining terms using recursive
    // formula.
    for (int i=1; i< n; i++)
    {
        int curr = arr[i-1] - i;
        int j;
        for (j = 0; j < i; j++)
        {
            // If arr[i-1] - i is negative or
            // already exists.
            if ((arr[j] == curr) || curr < 0)
            {
                curr = arr[i-1] + i;
                break;
            }
        }
 
        arr[i] = curr;
        printf("%d, ", arr[i]);
    }
}
 
// Driver code
int main()
{
    int n = 17;
    recaman(n);
    return 0;
}


Java
// Java program to print n-th number in Recaman's
// sequence
import java.io.*;
 
class GFG {
     
    // Prints first n terms of Recaman sequence
    static void recaman(int n)
    {
        // Create an array to store terms
        int arr[] = new int[n];
     
        // First term of the sequence is always 0
        arr[0] = 0;
        System.out.print(arr[0]+" ,");
     
        // Fill remaining terms using recursive
        // formula.
        for (int i = 1; i < n; i++)
        {
            int curr = arr[i - 1] - i;
            int j;
            for (j = 0; j < i; j++)
            {
                // If arr[i-1] - i is negative or
                // already exists.
                if ((arr[j] == curr) || curr < 0)
                {
                    curr = arr[i - 1] + i;
                    break;
                }
            }
     
            arr[i] = curr;
            System.out.print(arr[i]+", ");
             
        }
    }
     
    // Driver code
    public static void main (String[] args)
    {
        int n = 17;
        recaman(n);
 
    }
}
 
// This code is contributed by vt_m


Python 3
# Python 3 program to print n-th
# number in Recaman's sequence
 
# Prints first n terms of Recaman
# sequence
def recaman(n):
 
    # Create an array to store terms
    arr = [0] * n
 
    # First term of the sequence
    # is always 0
    arr[0] = 0
    print(arr[0], end=", ")
 
    # Fill remaining terms using
    # recursive formula.
    for i in range(1, n):
     
        curr = arr[i-1] - i
        for j in range(0, i):
         
            # If arr[i-1] - i is
            # negative or already
            # exists.
            if ((arr[j] == curr) or curr < 0):
                curr = arr[i-1] + i
                break
             
        arr[i] = curr
        print(arr[i], end=", ")
 
# Driver code
n = 17
 
recaman(n)
 
# This code is contributed by Smitha.


C#
// C# program to print n-th number in Recaman's
// sequence
using System;
 
class GFG {
     
    // Prints first n terms of Recaman sequence
    static void recaman(int n)
    {
        // Create an array to store terms
        int []arr = new int[n];
     
        // First term of the sequence is always 0
        arr[0] = 0;
        Console.Write(arr[0]+" ,");
     
        // Fill remaining terms using recursive
        // formula.
        for (int i = 1; i < n; i++)
        {
            int curr = arr[i - 1] - i;
            int j;
            for (j = 0; j < i; j++)
            {
                // If arr[i-1] - i is negative or
                // already exists.
                if ((arr[j] == curr) || curr < 0)
                {
                    curr = arr[i - 1] + i;
                    break;
                }
            }
     
            arr[i] = curr;
        Console.Write(arr[i]+", ");
             
        }
    }
     
    // Driver code
    public static void Main ()
    {
        int n = 17;
        recaman(n);
 
    }
}
 
// This code is contributed by vt_m.


PHP


Javascript


C++
// C++ program to print n-th number in Recaman's
// sequence
#include 
using namespace std;
 
// Prints first n terms of Recaman sequence
void recaman(int n)
{
    if (n <= 0)
      return;
 
    // Print first term and store it in a hash
    printf("%d, ", 0);
    unordered_set s;
    s.insert(0);
 
    // Print remaining terms using recursive
    // formula.
    int prev = 0;
    for (int i=1; i< n; i++)
    {
        int curr = prev - i;
 
        // If arr[i-1] - i is negative or
        // already exists.
        if (curr < 0 || s.find(curr) != s.end())
           curr = prev + i;
 
        s.insert(curr);
 
        printf("%d, ", curr);
        prev = curr;
    }
}
 
// Driver code
int main()
{
    int n = 17;
    recaman(n);
    return 0;
}


Java
// Java program to print n-th number
// in Recaman's sequence
import java.util.*;
 
class GFG
{
 
// Prints first n terms of Recaman sequence
static void recaman(int n)
{
    if (n <= 0)
    return;
 
    // Print first term and store it in a hash
    System.out.printf("%d, ", 0);
    HashSet s = new HashSet();
    s.add(0);
 
    // Print remaining terms using
    // recursive formula.
    int prev = 0;
    for (int i = 1; i< n; i++)
    {
        int curr = prev - i;
 
        // If arr[i-1] - i is negative or
        // already exists.
        if (curr < 0 || s.contains(curr))
            curr = prev + i;
 
        s.add(curr);
 
        System.out.printf("%d, ", curr);
        prev = curr;
    }
}
 
// Driver code
public static void main(String[] args)
{
    int n = 17;
    recaman(n);
}
}
 
// This code is contributed by Rajput-Ji


Python3
# Python3 program to print n-th number in
# Recaman's sequence
 
# Prints first n terms of Recaman sequence
def recaman(n):
 
    if(n <= 0):
        return
 
    # Print first term and store it in a hash
    print(0, ",", end='')
    s = set([])
    s.add(0)
 
    # Print remaining terms using recursive
    # formula.
    prev = 0
    for i in range(1, n):
 
        curr = prev - i
 
        # If arr[i-1] - i is negative or
        # already exists.
        if(curr < 0 or curr in s):
            curr = prev + i
 
        s.add(curr)
 
        print(curr, ",", end='')
        prev = curr
 
# Driver code
if __name__=='__main__':
    n = 17
    recaman(n)
 
# This code is contributed by
# Sanjit_Prasad


C#
// C# program to print n-th number
// in Recaman's sequence
using System;
using System.Collections.Generic;
 
class GFG
{
 
// Prints first n terms of Recaman sequence
static void recaman(int n)
{
    if (n <= 0)
    return;
 
    // Print first term and store it in a hash
    Console.Write("{0}, ", 0);
    HashSet s = new HashSet();
    s.Add(0);
 
    // Print remaining terms using
    // recursive formula.
    int prev = 0;
    for (int i = 1; i < n; i++)
    {
        int curr = prev - i;
 
        // If arr[i-1] - i is negative or
        // already exists.
        if (curr < 0 || s.Contains(curr))
            curr = prev + i;
 
        s.Add(curr);
 
        Console.Write("{0}, ", curr);
        prev = curr;
    }
}
 
// Driver code
public static void Main(String[] args)
{
    int n = 17;
    recaman(n);
}
}
 
// This code is contributed by Princi Singh


PHP


Javascript


输出:

0, 1, 3, 6, 2, 7, 13, 20, 12, 21, 11, 22, 10, 23, 9, 24, 8, 

时间复杂度:O(n 2 )
辅助空间:O(n)
优化:
我们可以使用散列来存储先前计算的值,并使该程序在 O(n) 时间内工作。

C++

// C++ program to print n-th number in Recaman's
// sequence
#include 
using namespace std;
 
// Prints first n terms of Recaman sequence
void recaman(int n)
{
    if (n <= 0)
      return;
 
    // Print first term and store it in a hash
    printf("%d, ", 0);
    unordered_set s;
    s.insert(0);
 
    // Print remaining terms using recursive
    // formula.
    int prev = 0;
    for (int i=1; i< n; i++)
    {
        int curr = prev - i;
 
        // If arr[i-1] - i is negative or
        // already exists.
        if (curr < 0 || s.find(curr) != s.end())
           curr = prev + i;
 
        s.insert(curr);
 
        printf("%d, ", curr);
        prev = curr;
    }
}
 
// Driver code
int main()
{
    int n = 17;
    recaman(n);
    return 0;
}

Java

// Java program to print n-th number
// in Recaman's sequence
import java.util.*;
 
class GFG
{
 
// Prints first n terms of Recaman sequence
static void recaman(int n)
{
    if (n <= 0)
    return;
 
    // Print first term and store it in a hash
    System.out.printf("%d, ", 0);
    HashSet s = new HashSet();
    s.add(0);
 
    // Print remaining terms using
    // recursive formula.
    int prev = 0;
    for (int i = 1; i< n; i++)
    {
        int curr = prev - i;
 
        // If arr[i-1] - i is negative or
        // already exists.
        if (curr < 0 || s.contains(curr))
            curr = prev + i;
 
        s.add(curr);
 
        System.out.printf("%d, ", curr);
        prev = curr;
    }
}
 
// Driver code
public static void main(String[] args)
{
    int n = 17;
    recaman(n);
}
}
 
// This code is contributed by Rajput-Ji

蟒蛇3

# Python3 program to print n-th number in
# Recaman's sequence
 
# Prints first n terms of Recaman sequence
def recaman(n):
 
    if(n <= 0):
        return
 
    # Print first term and store it in a hash
    print(0, ",", end='')
    s = set([])
    s.add(0)
 
    # Print remaining terms using recursive
    # formula.
    prev = 0
    for i in range(1, n):
 
        curr = prev - i
 
        # If arr[i-1] - i is negative or
        # already exists.
        if(curr < 0 or curr in s):
            curr = prev + i
 
        s.add(curr)
 
        print(curr, ",", end='')
        prev = curr
 
# Driver code
if __name__=='__main__':
    n = 17
    recaman(n)
 
# This code is contributed by
# Sanjit_Prasad

C#

// C# program to print n-th number
// in Recaman's sequence
using System;
using System.Collections.Generic;
 
class GFG
{
 
// Prints first n terms of Recaman sequence
static void recaman(int n)
{
    if (n <= 0)
    return;
 
    // Print first term and store it in a hash
    Console.Write("{0}, ", 0);
    HashSet s = new HashSet();
    s.Add(0);
 
    // Print remaining terms using
    // recursive formula.
    int prev = 0;
    for (int i = 1; i < n; i++)
    {
        int curr = prev - i;
 
        // If arr[i-1] - i is negative or
        // already exists.
        if (curr < 0 || s.Contains(curr))
            curr = prev + i;
 
        s.Add(curr);
 
        Console.Write("{0}, ", curr);
        prev = curr;
    }
}
 
// Driver code
public static void Main(String[] args)
{
    int n = 17;
    recaman(n);
}
}
 
// This code is contributed by Princi Singh

PHP


Javascript


输出:

0, 1, 3, 6, 2, 7, 13, 20, 12, 21, 11, 22, 10, 23, 9, 24, 8,