On Sat, Sep 19, 2009 at 9:26 PM, Craig Citro <[email protected]> wrote: > >> Is it possible to compose/iterate functions in sage by a functional way >> without any loop for or while. >> > > Why don't you want to use a loop? I think it's the most natural way to > do this in Python. > >> When I used mupad I could get the u(100) term of this sequence by : >> >> (sin@@100) (1) # u(0)=1 and u(n+1)=sin (u(n)) >> > > There's no default syntax for doing this kind of thing, but you could > always add a function that does it. This isn't perfect, but it does > what you want in one line: > > reduce(lambda x,y: y(x), [sin for _ in xrange(100)], 1)
This is equivalent to the cleaner and more concise: sage: reduce(lambda x,y: y(x), [sin]*100, 1) -- William > > Of course, it's going to return something symbolic: you could use the > .n() method to get an approximation. Or apply it to something inexact. > > sage: reduce(lambda x,y: y(x), [sin for _ in xrange(100)], 1) > sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(1)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) > > sage: reduce(lambda x,y: y(x), [sin for _ in xrange(100)], 1).n() > 0.168852488727981 > > sage: reduce(lambda x,y: y(x), [sin for _ in xrange(100)], 1.0) > 0.168852488727981 > > Of course, I really don't think any of those (including the mupad > example) is nearly as clear as > > sage: x = 1 > sage: for _ in xrange(100): > ....: x = sin(x) > ....: > sage: x > sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(1)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) > sage: x.n() > 0.168852488727981 > > A nicer fix would be to create a new class for recurrence relations -- > so you could do something like this: > > sage: my_sequence = RecurrenceRelation(relation=lambda previous_term: > sin(previous_term), initial_value=1) > sage: my_sequence[100] > sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(1)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) > sage: my_sequence[100].n() > 0.168852488727981 > > -cc > > > > -- William Stein Associate Professor of Mathematics University of Washington http://wstein.org --~--~---------~--~----~------------~-------~--~----~ To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/sage-support URLs: http://www.sagemath.org -~----------~----~----~----~------~----~------~--~---
