Scheme

Desculpem a ignorância, mas o quê que é um vector em programação (mais propriamente em scheme)?
Pelo que tive a ler os vectores são tipo strings, só que podem conter mais do que caracteres...se alguém me poder explicar o que são e para que servam agradecia...
 
Os vectores servem num fundo para armazenar coisas: números, caracteres, outros vectores, etc.

Em Scheme tens funções sobre vectores já definidas:

make-vector , vector , vector-ref , vector-length, vector_set , vector?

Não esquecer também que um vector de tamanho N , as suas posições variam de 0 a (N-1).

Cumps
 
Exercício em scheme

Deparei-me com um exercício em scheme que não consigo resolver pela forma que me pedem.

O exercício consiste em criar uma função que resolva uma equação do 2º grau através da fórmula x= (-b+ raiz (bb-4ac))/(2a).
Eu resolvi o exercício fazendo:
(define solve (lambda (a b c) (/ (+ (- b) (sqrt (- (* b b) (* 4 a c)))) (* 2 a))))

e se depois quiser verificar se está correcto faço, por exemplo: (solve 1 1 -1). Este procedimento está correcto e dá uma resposta correcta ao exercício. O único problema é que eles dizem para usar o let para calcular o valor intermédio delta= b*b-4*a*c e eu não sei onde é que coloco o let.

Se alguém me poder ajudar agradecia e já agora espero que não percam a cabeça no meio de tantos parênteses:lol:
 
Desculpa mas não percebimuito bem...o que eu fiz foi:
(define solve (lambda (a b c) (let ((delta ((- (* b b) (* 4 a c))))) (/ (+ (- b) (sqrt delta)) (* 2 a)))))

e se depois meter para correr o programa não dá erro, mas se eu acrescentar (solve 1 1 -1), para resolver uma equação o programa diz "procedure application: expected procedure, given: 5 (no arguments)", o quê que eu estou a fazer mal??

Já não preciso de ajuda...já resolvi o problema, pus:
(define solve (lambda (a b c) (let ((delta (- (* b b) (* 4 a c)))) (/ (+ (- b) (sqrt delta)) (* 2 a)))))

e se depois acrescentar, noutra linha, (solve 1 1 -1), o programa devolve o valor correcto.
Obrigado pela ajuda Mr. Brightside.
 
Última edição:
Também pode fazer o programa sem lambdas nem lets fazendo a declaração da variáveis juntamente com o nome do procedimento:

Código:
(define (foo a b c) *random code here*)
 
Pessoal mais uma vez preciso de ajuda...Tenho que fazer um exercício em scheme que consiste em definir uma função f(x) definida por ramos em que a expressão da função é:
-1 se x*x<=5; 0 se 5<x*x<8; 1 se x*x>=8.

Para resolver o exercício eu fiz:
Código:
(define f
(lambda (x)
(if (<= (* x x) 5) -1
(if (< 5 (* x x) 8) 0 1))))
que é uma resposta correcta para o problema (se depois quiser verificar se está correcto faço noutra linha, por exemplo: (f 4) e o programa devolve o valor correcto.
O problema deste exercício é que eles pretendem que eu use o let para definir o x*x e assim não ter de escrever o x*x várias vezes.
Eu fiz o seguinte:
Código:
(define f
(lambda (x)
(let (y) (* x x)
(if (<= y 5) -1
(if (< 5 y 8) 0 1)))))

Só que dá o seguinte erro: "let: bad syntax (not an identifier and expression for a binding) in: y"
Gostava que alguém me dissesse o quê que estou a fazer de incorrecto.

Peço desculpa por ter colocado o post, mas já consegui perceber o erro...
Faltava-me uns parenteses...o programa ficou:
Código:
(define f 
  (lambda (x) 
    (let ((y (* x x)))
      (if (<= y 5) -1 
          (if (< 5 y 8) 0 1)))))
Na linha do let faltava-me por parênteses antes do y.
 
Última edição pelo moderador:
Tenhooutro exercício que não consigo fazer, mas desta vez não faço mesmo ideia de como hei-de fazer...o exercício consiste em definir uma função expe(x,n)=x^n.
Antes deste exercício eu tinha que definir uma função f(x)=2^x que eu resolvi fazendo:


Código:
(define f
(lambda (x)
(if (= x 0)
1
(* 2 (f (- x 1))))))
Este exercício é parecido, mas mete 2 variáveis...eu já fiz:


Código:
(define expe
(lambda (n x)
(if (= n 0)
1
(* x (expe ((- n 1) x))))))

E quando faço (expe 2 3), para verificar se está certo, dá-me o erro: "procedure application: expected procedure, given: 0; arguments were: 2", se alguém me puder ajudar agradecia.
 
Última edição:
Mais uma vez obrigado Mr. Brightside, já consegui resolver o exercício :D, de facto eram os (p) (a) (r) (ê) (n) (t) (e) (s) (e) (s) que estavam a mais...mas quem se dedica a scheme começa a ganhar tiques com parênteses e mete parênteses em tudo quanto é sítio :lol:
 
Mais uma vez estou a fazer um exercício em scheme e estou com problemas...o exercício consiste em definir uma função f(n): sin 1+cos 2+sin 3+ cos 4+ sin|cos n, conforme n seja par ou impar. Eu fiz o seguinte:

Código:
(define f
  (lambda (n)
    (if (= n 1)
        (sin 1)
        (if (even? n) #t
                  (+ (cos n) (f (- n 1)))
                  (+ (sen n) (f (- n 1)))))))

O problema é que me dá o seguinte erro: "if: bad syntax in: (if (even? n) #t (+ (cos n) (f (- n 1))) (+ (sen n) (f (- n 1))))"

Já agora se eu fizer:

Código:
(define f
(lambda (n)
(if (= n 1)
(sin 1)
(if ((even? n) #t)
(+ (cos n) (f (- n 1)))
(+ (sen n) (f (- n 1)))))))
(f 5)
Dá-me o erro "procedure application: expected procedure, given: #f; arguments were: #t"


Se alguém me poder ajudar agradecia.
 
Última edição:
Desculpem o incómudo mas já resolvi o problema...bastava na linha do if não ter posto o #t.

Agora não consigo é somar todos os elementos de uma lista, eu já fiz:

Código:
(define soma
  (lambda (l)
    (if (null? l)
        0
        (+ (car l) (car (cdr l))))))

Só que isto só soma os 2 primeiros números.
Agradeço desde já a quem conseguir resolver o problema, e mais uma vez desculpem ter colocado uma dúvida que afinal já resolvi.
 
Agora não consigo é somar todos os elementos de uma lista, eu já fiz:

Código:
(define soma
  (lambda (l)
    (if (null? l)
        0
        (+ (car l) (car (cdr l))))))

Só que isto só soma os 2 primeiros números.
Agradeço desde já a quem conseguir resolver o problema, e mais uma vez desculpem ter colocado uma dúvida que afinal já resolvi.

A solução é fazer isso recursivamente. No caso da condição ser falsa chamas a mesma função para (cdr l) em vez de (car (cdr l)).
 
Eu percebi mais ou menos o que disseste, o problema é que não sei como definir a função recursivamente. Se pudesses pôr como fica o programa agradecia.
 
Muito obrigado Mr. Brightside, funciona perfeitamente :D. Eu só não estava a ver como se fazia, porque só tava habituado a trabalhar com funçºoes numéricas e nesse caso fas-se f(n-1) em vez de f(cdr l)
 
Back
Topo