2017-07-09 44 views
-2

是否有可能實現Scheme函數(一個函數 - 它的重要),它獲得一個列表和k,並且檢索k的大小排列,例如:(1 2 3) ,k = 2將輸出{(1,1),(1,2),(1,3),(2,1),(2,2),...}(9個選項)。創建k大小的排列而不定義更多的功能

+2

當然是了。你有什麼嘗試? –

+0

定義更多功能是什麼意思?你的意思是你只想暴露一個全局或你是否受限於創建本地函數呢?匿名函數可以嗎?除非你的問題顯示出努力,否則你很可能不會得到包含代碼的答案。告訴我們你到目前爲止所嘗試過的!使用編輯按鈕。 – Sylwester

回答

-1

它可以做任何事情沒有,只要你有拉姆達定義什麼:

(define (fib n) 
    ;; bad internal definition 
    (define (helper n a b) 
    (if (zero? n) 
     a 
     (helper (- n 1) b (+ a b)))) 
    (helper n 0 1)) 

使用ž組合子:

(define Z 
    (lambda (f) 
    ((lambda (g) 
     (f (lambda args (apply (g g) args)))) 
    (lambda (g) 
     (f (lambda args (apply (g g) args))))))) 

(define (fib n) 
    ((Z (lambda (helper) 
     (lambda (n a b) 
      (if (zero? n) 
       a 
       (helper (- n 1) b (+ a b)))))) 
    n 0 1)) 

現在,我們從來沒有叫Z SO我們可以替代的價值Z爲Z的功能,它會做同樣的事情:

(define (fib n) 
    (((lambda (f) 
     ((lambda (g) 
     (f (lambda args (apply (g g) args)))) 
     (lambda (g) 
     (f (lambda args (apply (g g) args)))))) 
    (lambda (helper) 
     (lambda (n a b) 
     (if (zero? n) 
      a 
      (helper (- n 1) b (+ a b)))))) 
    n 0 1)) 

有你去,薩由Alonzo Church

-1

這不僅是可能的,它很容易。只需使用一個loop

(define permute 
    (lambda (k lst) 
    (let loop ((result (map list lst)) 
       (i 1)) 
     (if (= i k) 
      result 
      (loop 
      ;; code to add each element of the original list 
      ;; to each element of the result list 
      (1+ i))))))