Elementos de Programação - LMAC, MEBiom 2016/17

Ficha 1 - Enunciado A (1 valor, 10 minutos)

Número:

Nome:

(a) Considere a seguinte definição recursiva em Python e descreva sucintamente qual a função calculada por funA.

In [1]:
def funA(n):
    if n<10:
        return n
    elif (n%10)>funA(n//10):
        return n%10
    else:
        return funA(n//10)

A função funA calcula, para cada número natural n, o maior dígito da sua representação decimal.

(b) Defina recursivamente em Python uma função fpares que dada uma lista de inteiros w devolva como resultado a lista dos valores funA(n) para os elementos n de w tais que n é um número par.

Neste exercício não pode usar definições por compreensão nem métodos. As únicas construções sobre listas permitidas são: lista vazia ([]), acesso aos elementos da lista por posição (lista[posição]), seccionamento da lista (lista[posição:posição]) e concatenação (+).

In [2]:
def fpares(w):
    if w==[]:
        return []
    elif w[0]%2==0:
        return [funA(w[0])]+fpares(w[1:])
    else:
        return fpares(w[1:])
    
fpares([100,120,43])
Out[2]:
[1, 2]

Elementos de Programação - LMAC, MEBiom 2016/17

Ficha 1 - Enunciado B (1 valor, 10 minutos)

Número:

Nome:

(a) Considere a seguinte definição recursiva em Python e descreva sucintamente qual a função calculada por funB.

In [1]:
def funB(n,d):
    if n<10:
        return n==d
    elif (n%10)==d:
        return True
    else:
        return funB(n//10,d)

A função funB calcula, para cada número natural n e dígito d, o predicado que é verdadeiro se e só se o dígito d ocorre na representação decimal de n.

(b) Defina recursivamente em Python uma função fquads que dada uma lista de inteiros w devolva como resultado a lista dos quadrados dos elementos n de w para os quais se verifica funB(n,1).

Neste exercício não pode usar definições por compreensão nem métodos. As únicas construções sobre listas permitidas são: lista vazia ([]), acesso aos elementos da lista por posição (lista[posição]), seccionamento da lista (lista[posição:posição]) e concatenação (+).

In [2]:
def fquads(w):
    if w==[]:
        return []
    elif funB(w[0],1):
        return [w[0]**2]+fquads(w[1:])
    else:
        return fquads(w[1:])

fquads([1,2,33,101,99])
Out[2]:
[1, 10201]

Elementos de Programação - LMAC, MEBiom 2016/17

Ficha 1 - Enunciado C (1 valor, 10 minutos)

Número:

Nome:

(a) Considere a seguinte definição recursiva em Python e descreva sucintamente qual a função calculada por funC.

In [1]:
def funC(n):
    if n<10:
        return n
    elif (n%10)<funC(n//10):
        return n%10
    else:
        return funC(n//10)

A função funC calcula, para cada número natural n, o menor dígito da sua representação decimal.

(b) Defina recursivamente em Python uma função fmaior5 que dada uma lista de inteiros w devolva como resultado a lista dos elementos n de w para os quais funC(n) é maior que 5.

Neste exercício não pode usar definições por compreensão nem métodos. As únicas construções sobre listas permitidas são: lista vazia ([]), acesso aos elementos da lista por posição (lista[posição]), seccionamento da lista (lista[posição:posição]) e concatenação (+).

In [2]:
def fmaior5(w):
    if w==[]:
        return []
    elif funC(w[0])>5:
        return [w[0]]+fmaior5(w[1:])
    else:
        return fmaior5(w[1:])

fmaior5([345,26,87,53,696,19])
Out[2]:
[87, 696]

Elementos de Programação - LMAC, MEBiom 2016/17

Ficha 1 - Enunciado D (1 valor, 10 minutos)

Número:

Nome:

(a) Considere a seguinte definição recursiva em Python e descreva sucintamente qual a função calculada por funD.

In [1]:
def funD(n):
    if n<10:
        return True
    elif n<100:
        return n%10==n//10
    else:
        return n%10==(n//10)%10 and funD(n//10)

A função funD calcula, para cada número natural n, o predicado que é verdadeiro se e só todos os dígitos da representação decimal de n são iguais.

(b) Defina recursivamente em Python uma função fnot que dada uma lista de inteiros w devolva como resultado a lista dos elementos n de w para os quais não se verifica funD(n).

Neste exercício não pode usar definições por compreensão nem métodos. As únicas construções sobre listas permitidas são: lista vazia ([]), acesso aos elementos da lista por posição (lista[posição]), seccionamento da lista (lista[posição:posição]) e concatenação (+).

In [2]:
def fnot(w):
    if w==[]:
        return []
    elif funD(w[0]):
        return fnot(w[1:])
    else:
        return [w[0]]+fnot(w[1:])

fnot([345,999,206,12,8007,53,11])
Out[2]:
[345, 206, 12, 8007, 53]