Haskell (Lambdabot), 92 85 byte
x#y|x==y=[[x]]|1>0=(guard(mod x y<1)>>(y:).map(y*)<$>div x y#2)++x#(y+1)
map(1:).(#2)
Cần Lambdabot Haskell kể từ khi được guardyêu cầu Control.Monadnhập khẩu. Hàm chính là một hàm ẩn danh, mà tôi đã nói là được phép và nó sẽ loại bỏ một vài byte.
Cảm ơn Laikoni vì đã tiết kiệm bảy byte.
Giải trình:
Monads rất tiện dụng.
x # y
Đây là chức năng đệ quy của chúng tôi thực hiện tất cả các công việc thực tế. xlà số chúng tôi tích lũy được (sản phẩm của các ước số còn lại trong giá trị) và ylà số tiếp theo chúng tôi nên thử chia thành số đó.
| x == y = [[x]]
Nếu xbằng ythì chúng ta đã thực hiện đệ quy. Chỉ cần sử dụng xnhư là kết thúc của chuỗi gozinta hiện tại và trả lại nó.
| 1 > 0 =
Haskell golf-ism cho "Đúng". Đó là, đây là trường hợp mặc định.
(guard (mod x y < 1) >>
Bây giờ chúng tôi đang hoạt động trong danh sách đơn nguyên. Trong danh sách đơn nguyên, chúng tôi có khả năng đưa ra nhiều lựa chọn cùng một lúc. Điều này rất hữu ích khi tìm thấy "tất cả có thể" của một cái gì đó do kiệt sức. Các guardtuyên bố nói "chỉ xem xét các lựa chọn sau đây nếu một điều kiện là đúng". Trong trường hợp này, chỉ xem xét lựa chọn sau nếu ychia x.
(y:) . map (y *) <$> div x y#2)
Nếu ykhông phân chia x, chúng ta có quyền lựa chọn thêm yvào chuỗi gozinta. Trong trường hợp này, đệ quy gọi (#), bắt đầu lại ở y = 2với xbằng x / y, vì chúng ta muốn "yếu tố out" mà ychúng ta vừa bổ sung vào chuỗi. Sau đó, bất kể kết quả từ cuộc gọi đệ quy này là gì, nhiều giá trị của nó do ychúng tôi chỉ cần đưa ra và thêm yvào chuỗi gozinta chính thức.
++
Hãy xem xét lựa chọn sau đây là tốt. Điều này chỉ đơn giản là thêm hai danh sách lại với nhau, nhưng về mặt đơn giản, chúng ta có thể nghĩ về nó như nói "chọn giữa làm việc này HOẶC điều này khác".
x # (y + 1)
Tùy chọn khác là chỉ cần tiếp tục đệ quy và không sử dụng giá trị y. Nếu ykhông phân chia xthì đây là lựa chọn duy nhất. Nếu ykhông chia xthì tùy chọn này sẽ được thực hiện cũng như tùy chọn khác và kết quả sẽ được kết hợp.
map (1 :) . (# 2)
Đây là chức năng gozinta chính. Nó bắt đầu đệ quy bằng cách gọi (#)với đối số của nó. A 1được thêm vào mỗi chuỗi gozinta, bởi vì (#)hàm không bao giờ đặt các chuỗi vào chuỗi.