给定一个整数 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,