Scala: 110
type B=BigInt
def r(a:B,b:B,f:(B,B)=>B):B=if(b>1)f(a,r(a,b-1,f))else a
def h(a:B,b:B)=r(a,b,r(_,_,r(_,_,(_+_))))
vô dụng:
type B=BigInt
def recursive (a:B, b:B, f:(B,B)=>B): B =
if (b>1) f (a, recursive (a, b-1, f))
else a
recursive (2, 3, recursive (_, _, recursive (_, _, (_ + _))))
giải trình:
type B=BigInt
def p (a:B, b:B):B = a+b
def m (a:B, b:B):B = if (b>1) p (a, m (a, b-1)) else a
def h (a:B, b:B):B = if (b>1) m (a, h (a, b-1)) else a
def t (a:B, b:B):B = if (b>1) h (a, t (a, b-1)) else a
cộng, mul, cao (: = pow), tetination đều hoạt động theo cùng một cách. Mẫu chung có thể được trích xuất dưới dạng phương thức đệ quy, có hai hàm BigInt và một hàm cơ bản:
def r (a:B, b:B, f:(B,B)=>B):B =
if (b>1) f(a, r(a, b-1, f)) else a
r (4, 3, r (_,_, r(_,_, (_+_))))
Phần gạch chân là giữ chỗ cho một cái gì đó được gọi trong chuỗi này, ví dụ: phép cộng cộng (a, b) = (a + b); do đó ( + ) là một hàm có hai đối số và thêm chúng (a + b).
Thật không may, tôi gặp vấn đề với kích thước ngăn xếp. Nó hoạt động cho các giá trị nhỏ cho 4 (ví dụ: 2) hoặc nếu tôi giảm độ sâu cho một bước:
def h(a:B,b:B)=r(a,b,r(_,_,(_*_))) // size -7, penalty + 5
def h(a:B,b:B)=r(a,b,r(_,_,r(_,_,(_+_))))
Mã ban đầu là 112 ký tự và sẽ ghi điểm, nếu hợp lệ, 107. Có lẽ tôi tìm ra cách tăng ngăn xếp.
Thuật toán mở rộng có thể được chuyển đổi thành các cuộc gọi thích hợp:
type B=BigInt
def p(a:B,b:B):B=a+b
import annotation._
@tailrec
def m(a:B,b:B,c:B=0):B=if(b>0)m(a,b-1,p(a,c))else c
@tailrec
def h(a:B,b:B,c:B=1):B=if(b>0)h(a,b-1,m(a,c))else c
@tailrec
def t(a:B,b:B,c:B=1):B=if(b>0)t(a,b-1,h(a,c))else c
Cuộc gọi thích hợp dài hơn phương thức ban đầu, nhưng không tăng luồng stackover trong phiên bản dài - tuy nhiên nó không mang lại kết quả trong thời gian hợp lý. t (2,4) vẫn ổn, nhưng t (3,3) đã bị tôi dừng lại sau 5 phút. Tuy nhiên, nó rất thanh lịch, phải không?
// 124 = 119-5 bonus
type B=BigInt
def r(a:B,b:B,c:B,f:(B,B)=>B):B=if(b>0)r(a,b-1,f(a,c),f)else c
def t(a:B,b:B)=r(a,b,1,r(_,_,1,r(_,_,0,(_+_))))
Và bây giờ cũng giống như trên: sử dụng phép nhân hôi thối (chúng tôi thậm chí có lãi trong khi từ chối phần thưởng là 5, vì chúng tôi lưu được 7 ký tự: win = 4 ký tự :)
// 115 without bonus
type B=BigInt
def r(a:B,b:B,c:B,f:(B,B)=>B):B=if(b>0)r(a,b-1,f(a,c),f)else c
def t(a:B,b:B)=r(a,b,1,r(_,_,1,(_*_)))
cầu nguyện:
timed ("t(4,3)")(t(4,3))
t(4,3): 1
scala> t(4,3)
res89: B = 13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096
thời gian chạy: 1ms.
*
là nhân trong một số hoàn cảnh, nhưng nó cũng là đơn giản lặp điều hành:{block}N*
tương đương với C-phong cáchfor(i=0;i<N;i++){block}
. Trường hợp cạnh khó khăn là phép nhân chuỗi / mảng ('a'3*
cho'aaa'
), nhưng đó không phải là vấn đề do một mảng các4***3
phần tử sẽ tràn RAM.