Answer:
Wikipedia has a great article on Functional Programming with some of the examples you ask for. @Konrad Rudolph already provided the link to the OOP article.
I don't think one paradigm is a super-set of the other. They are different perspectives on programming and some problems are better solved from one perspective and some from another.
Your question is further complicated by all the implementations of FP and OOP. Each language has its own quirks that are relevant to any good answer to your question.
Increasingly Tangential Rambling:
I like the idea that a language like Scala tries to give you the best of both worlds. I worry that it gives you the complications of both worlds as well.
Java is an OO language, but version 7 added a "try-with-resources" feature which can be used to imitate a kind of closure. Here it imitates updating a local variable "a" in the middle of another function, without making it visible to that function. In this case the first half of the other function is the ClosureTry() constructor and the second half is the close() method.
public class ClosureTry implements AutoCloseable {
public static void main(String[] args) {
int a = 1;
try(ClosureTry ct = new ClosureTry()) {
System.out.println("Middle Stuff...");
a = 2;
}
System.out.println("a: " + a);
}
public ClosureTry() {
System.out.println("Start Stuff Goes Here...");
}
/** Interface throws exception, but we don't have to. */
public void close() {
System.out.println("End Stuff Goes Here...");
}
}
Output:
Start Stuff Goes Here...
Middle Stuff...
End Stuff Goes Here...
a: 2
This is could be useful for its intended purpose of opening a stream, writing to the stream, and closing it reliably, or for simply pairing two functions in a way that you don't forget to call the second one after doing some work between them. Of course, it's so new and unusual that another programmer might remove the try block without realizing they are breaking something, so it's currently kind of an anti-pattern, but interesting that it can be done.
You can express any loop in most imperative languages as a recursion. Objects and variables can be made immutable. Procecures can be written to minimize side effects (though I would argue that a true function is not possible on a computer - the time it takes to execute and the processor/disk/system resources it consumes are unavoidable side effects). Some functional languages can be made to do many if not all object-oriented operations as well. They don't have to be mutually exclusive, though some languages have limitations (like not allowing any updating of variables) that prevent certain patterns (like mutable fields).
To me, the most useful parts of object oriented programming are data hiding (encapsulation), treating similar-enough objects as the same (polymorphism), and collecting your data and methods that operate on that data together (objects/classes). Inheritance may be the flagship of OOP, but to me it is the least important and least used part.
The most useful parts of functional programming are immutability (tokens/values instead of variables), functions (no side effects), and closures.
I don't think it's object-oriented, but I have to say that one of the most useful things in computer science is the ability to declare an interface, then have various pieces of functionality and data implement that interface. I also like to have a few mutable pieces of data to work with, so I guess I'm not totally comfortable in exclusively functional languages, even though I try to limit mutability and side effects in all my program designs.