2013-10-10 3 views
1

я работаю над жесткой проблемой слова, которая записана ниже, и мне нужна помощь в попытке выяснить, как подойти к этому:Нужна помощь в попытке написать процедуру для этого в схеме

Предположим, у вас есть функция Scheme, которая подсчитывает количество людей, поднятых определенной шиной при заданной остановке. Шина имеет множество остановок, каждому из которых присваивается число от 1 до 100. Напишите процедуру схемы, которая принимает (i) функцию f, которая дает количество людей, поднятых с каждой остановки, и (0) ii) целое число m и возвращает число остановок, на которых автобус поднял м или меньше людей. Пример: предположим, что функция автобусной остановки пикап выглядит следующим образом:

(define (stops n) 
    (cond ((= n 10) 20) 
      ((= n 18) 18) 
      ((= n 39) 52) 
      ((= n 52) 12) 
      ((= n 58) 23) 
      ((= n 70) 34) 
      ((= n 73) 18) 
      ((= n 82) 11) 
      ((= n 97) 33) 
      (else 0))) 

Когда процедура применяется к процедуре остановки выше и с учетом т = 20, он должен вернуть 5 потому что единственный остановок, где было 20 или меньше пассажиров подняли стопы 10, 18, 52, 73 и 82.

Моим первым подходом к этому было бы написать вспомогательную функцию для добавления параметра n, хотя я не совсем уверен, do (добавьте счет, может быть?). Кроме этого, я полностью застрял. Если бы я мог уточнить. руководство или направление этой проблемы, было бы весьма полезно.

+0

Вам нужно написать функцию, которая принимает в качестве аргументов процедуры 'f' и номер' M'. Вам нужно вызывать 'f' с каждым числом' i' от '1' до' 100' и ​​подсчитывать, сколько раз '(f i)' меньше или равно 'm'. –

+0

Не могли бы вы объяснить немного больше? У меня все еще возникают проблемы с логикой всего этого. – user2789945

ответ

1

Вот Ракетка-единственное решение:

(define (count-fewer-or-equal f m) 
    (count (lambda (i) (<= 1 (f i) m)) 
     (range 1 100))) 
1

Вы должны реализовать итерации с помощью рекурсии.

Вот псевдокод:

(define (count f m) 
    (define (count-iter i sum) 
    (if (> i 100) 
     sum 
     (count-iter (+ i 1) 
        (if (include-stop? i) 
         (+ sum 1) 
         sum)))) 
    (count-iter 1 0)) 
+2

FYI: Это идиоматически написано как '(пусть count-iter ((i 1) (sum 0)) ...)' – GoZoner

0

После решения, но далеко не единственный

б быть моим обозначение предиката, который возвращает 0 или 1 вместо #t или #F.

(define *potential-stops* (iota 100 1 1)) 

(define (stops-lt-m f m) 
    (let ((lt-m?b (lambda (x) (if (> (f x) m) 0 1)))) 
    (reduce + 0 (map lt-m?b potential-stops)))) 

Может также использоваться (длина (фильтр ...)) с использованием lt-m?

потенциалы-стопы, потому что это постоянный, но может потребоваться изменить, если система нумерации останова изменилась.

2

Я фанат по имени позволяет, так что:

(define (how-many f m) 
    (let loop ((i 1) (res 0)) 
    (if (<= i 100) 
     (loop (+ i 1) (if (<= 1 (f i) m) (+ res 1) res)) 
     res))) 
Смежные вопросы