pub fn generate(n: usize) -> Vec<u32> {
if n == 0 {
return vec![];
}
if n == 1 {
return vec![1];
}
if n == 2 {
return vec![1, 1];
}
let mut seq = vec![1, 1, 1];
for i in 3..n {
let next = seq[i - 2] + seq[i - 3];
seq.push(next);
}
seq
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_padovan_basic() {
let seq = generate(12);
assert_eq!(seq, vec![1, 1, 1, 2, 2, 3, 4, 5, 7, 9, 12, 16]);
}
#[test]
fn test_padovan_empty() {
let seq = generate(0);
assert_eq!(seq, Vec::<u32>::new());
}
#[test]
fn test_padovan_one() {
let seq = generate(1);
assert_eq!(seq, vec![1]);
}
#[test]
fn test_padovan_two() {
let seq = generate(2);
assert_eq!(seq, vec![1, 1]);
}
#[test]
fn test_padovan_three() {
let seq = generate(3);
assert_eq!(seq, vec![1, 1, 1]);
}
#[test]
fn test_padovan_recurrence() {
let seq = generate(15);
for i in 3..seq.len() {
assert_eq!(seq[i], seq[i - 2] + seq[i - 3]);
}
}
#[test]
fn test_padovan_known_values() {
let seq = generate(16);
assert_eq!(seq[0], 1);
assert_eq!(seq[1], 1);
assert_eq!(seq[2], 1);
assert_eq!(seq[3], 2); assert_eq!(seq[4], 2); assert_eq!(seq[5], 3); assert_eq!(seq[6], 4); assert_eq!(seq[7], 5); assert_eq!(seq[8], 7); assert_eq!(seq[9], 9); assert_eq!(seq[10], 12); assert_eq!(seq[11], 16); assert_eq!(seq[12], 21); assert_eq!(seq[13], 28); assert_eq!(seq[14], 37); assert_eq!(seq[15], 49); }
#[test]
fn test_padovan_growth() {
let seq = generate(15);
for i in 4..seq.len() {
assert!(seq[i] >= seq[i - 1]);
}
}
#[test]
fn test_padovan_slower_than_fibonacci() {
let padovan_seq = generate(12);
assert!(padovan_seq[11] < 144);
assert_eq!(padovan_seq[11], 16);
}
#[test]
fn test_padovan_triple_start() {
let seq = generate(5);
assert_eq!(seq[0], 1);
assert_eq!(seq[1], 1);
assert_eq!(seq[2], 1);
assert_eq!(seq[3], 2);
}
#[test]
fn test_padovan_plastic_ratio() {
let seq = generate(20);
let ratio = seq[19] as f32 / seq[18] as f32;
assert!(ratio > 1.30 && ratio < 1.35);
}
#[test]
fn test_padovan_longer_sequence() {
let seq = generate(20);
assert_eq!(seq.len(), 20);
assert_eq!(seq[15], 49); }
}
pub fn short() -> Vec<u32> {
generate(8)
}
pub fn classic() -> Vec<u32> {
generate(12)
}
pub fn extended() -> Vec<u32> {
generate(16)
}