2010-10-20 29 views
19

Tôi đã xem xét nhiều cách khác nhau để xây dựng danh sách lười biếng trong Perl 6 và tôi muốn thu thập tất cả các cách ngắn gọn để mô tả chuỗi Fibonacci.Có bao nhiêu cách để mô tả chuỗi Fibonacci trong Perl 6?

tôi sẽ bắt đầu này ra với ba từ masak 's tạp chí:

my @fibs := (0, 1, -> $a, $b { $a + $b } ... *); 

my @fibs := (0, 1, { $^a + $^b } ... *); 

my @fibs := (0, 1, *+* ... *); 

Tôi đã suy nghĩ một cái gì đó như thế này cũng sẽ làm việc, nhưng tôi nghĩ rằng tôi có sai cú pháp:

my @fibs := (0, 1, (@fibs Z+ @fibs[1..*])); 

Có thứ gì đó háo hức (lát cắt?) Và khiến Rakudo bước vào vòng lặp vô hạn. Đó là một bản dịch của định nghĩa Haskell:

fibs = 0 : 1 : zipWith (+) fibs (tail fibs) 

Cập nhật:

Có vẻ như vấn đề với ví dụ zipWith@fibs[1..*] lát. nếu tail được định nghĩa là sub tail (@x) {my $i = 1; {@x[$i++]}...*} thì nó hoạt động bình thường. Tôi sẽ được quan tâm để biết tại sao lát không phải là lười biếng từ bất cứ ai quen thuộc với ruột của Rakudo.

Một số khác tốt đẹp là:

my @fibs := (0, [\+] 1, @fibs); 
+3

Đây là một trong những lý do tôi thích Perl 6. :) –

+0

là câu hỏi về lỗi của bạn, tương đương khoảng càng tốt các giải pháp khác? Mã của bạn thiếu dấu ngoặc đơn đóng, nếu cú ​​pháp của Perl 6 không lạ hơn tôi nghĩ ... –

+0

Bạn đã thử mã của mình trên Pugs chưa? –

Trả lời

0

Bạn có thể sử dụng sự kỳ diệu của tỷ lệ vàng: hãy φ = (sqrt (5) +1)/2, và xác định fib (n) = (φ n + (1- φ) n)/sqrt (5).

Bạn có thể chuyển đổi một chức năng như vậy vào một danh sách lười biếng trong cách rõ ràng: Trong Haskell các công việc sau:

 
fibs=genfibs 0 where genfibs n=(round (fib n)):genfibs (n+1) 

Tôi sợ kiến ​​thức Perl 6 của tôi không phải là lên đến dịch này, xin lỗi! Bất cứ ai chỉnh sửa câu trả lời này để chỉnh sửa trong các mã sẽ kiếm được lòng biết ơn của tôi.

Một câu hỏi kiểm tra khác sẽ là liệt kê các cách tạo danh sách số Hamming lười biếng.

+1

Xin lỗi là có tính thông thái, nhưng để làm rõ: tỷ lệ golder là 0.5 * (sqrt (5) +1) và dạng đóng của một mã số là ((1 + sqrt (5))^n - (1-sqrt (5))^n)/(2^n * sqrt (5)) = (φ^n- (1-φ)^n)/sqrt (5) [http://mathworld.wolfram.com/FibonacciNumber.html ] – Phil

+1

@Phil: Có, tôi nên kiểm tra, ít nhất trường hợp đó n = 0 đã hoạt động. Cách xa một sự điều chỉnh về số lượng lớn; cảm ơn nhiều. –

+2

Một cách để biến một hàm như vậy thành một danh sách lười biếng trong Perl 6 là 'my @fibs = -> {fib $ ++} ... *'.Tôi không nghĩ rằng những gì bạn có thể dễ dàng dịch trực tiếp sang Perl 6 như các chức năng thường không lười biếng. '$ perl6 -e 'hằng số φ = (sqrt (5) +1)/2; sub fib (\ n) {(φ ** n - (1-φ) ** n)/sqrt (5)}; my @fibs = -> {round fib $ ++} ... *; nói @ fibs'', mặc dù bắt đầu nhận được kết quả không chính xác sau 70 kết quả đầu tiên do lỗi dấu phẩy động. (Tôi đã nhận được nhiều con số chính xác hơn với FatRats, nhưng điều đó làm chậm tính toán đáng kể) –

3

Các ngắn nhất có vẻ là

my @fibs := ^2,*+*...*;