1.2 Funções e os Processos que geram
Agora consideramos os elementos de programação: Usamos operações aritméticas primitivas, combinamos essas operações, e abstraímos essas operações compostas as declarando como funções compostas. Mas isso não é o suficiente para que possamos falar que sabemos programar. Nossa situação é análoga a alguém que aprendeu as regras de como as peças se movem em xadrez, mas não sabe nada sobre os começos típicos, táticas, e estratégia. Como o jogador iniciante de xadrez, ainda não sabemos os padrões comuns de uso no domínio. Nos falta conhecimento de que movimentos valem a pena serem feitos (que funções valem a pena declarar). Nos falta experiência para prever as consequências de fazer um movimento (executar uma função).
A habilidade de visualizar as consequências das ações que estão sendo consideradas é crucial para se tornar um programador especialista, assim como em qualquer atividade sintética ou criativa. Para se tornar um fotógrafo especialista, por exemplo, deve-se aprender a como olhar a cena e saber o quão escuro cada região vai aparecer em uma impressão para cada escolha possível de exposição e opções de processamento. Só assim pode-se fazer o raciocínio reverso, planejar o enquadramento, iluminação, exposição, e processamento para obter os efeitos desejados. Assim também é com a programação, onde estamos planejando o curso da ação a ser feita pelo processo e como controlamos o processo por meio de um programa. Para nos tornarmos especialistas, precisamos aprender a visualizar os processos gerados por vários tipos de funções. Apenas depois de termos desenvolvido essa habilidade, podemos aprender a construir programas confiáveis que apresentem o comportamento desejado.
Uma função é um padrão para a evolução local do processo computacional. Ela especifica como cada etapa do processo é feita sobre a etapa anterior. Gostaríamos de poder fazer afirmações sobre o comportamento geral, ou global, do processo cuja evolução local foi especificada por uma função. Isso é muito difícil de se fazer no geral, mas podemos pelo menos tentar descrever alguns padrões típicos do processo de evolução.
Nesta seção vamos examinar algumas "formas" comuns para processos gerados por funções simples. Também iremos investigar as taxas nas quais esses processos consomem os importantes recursos computacionais de tempo e espaço. As funções que vamos considerar são muito simples. O papel delas é semelhante ao desempenhado por padrões de teste em fotografia: como padrões prototípicos simplificados, em vez de exemplos práticos por si mesmos.