> 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) 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 --~--~---------~--~----~------------~-------~--~----~ To post to this group, send email to sage-support@googlegroups.com To unsubscribe from this group, send email to sage-support-unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/sage-support URLs: http://www.sagemath.org -~----------~----~----~----~------~----~------~--~---