練習 (3) を解くには FoldList 関数があったほうがいいですが、どうも Maxima にはなさそうです(探し方が足りないのかもしれませんが)。
そこで、練習 (3) はいったん飛ばして、FoldList を自前で定義することを考えていきます。いきなり FoldList を考えてもいいですが、まずは Fold 関数を考えることにします。
引数 func, var0, [var1, var2, var3, ..., varN ] が与えられたときに、次を返す関数を作れ。
func(...(func(func(func(var0,var1),var2),var3),...),varN)
こういうのは再帰で定義するのが良さそうです。
定義する関数を my_fold として・・・
- list が空なら、var0 を返して終了。
- そうでなければ、my_fold( func, func(var0, var1), [var2, var3, ... ] ) を呼ぶ。
my_fold( func, var0, list ) := block( if( list = [] ) then return( var0 ) else my_fold( func, func( var0, first(list) ), rest(list) ) );