2013-10-07 4 views
0

Я хочу написать код в SML, который имитирует, что С ++ какSML-Функциональное программирование

i=i+1; 

или

i++ 

Короче я хочу подсчитать, сколько раз цикл (рекурсия) выполняется, когда утверждение if истинно. Выяснение этого вопроса. Мой проблематичный код выглядит примерно так:

val i = 0; 
fun <function_name>() = 
    if <condition> 
    then (i+1; 
     <recursive_expression>) 
    else expression 

Но проблема в том, что ответ всегда не один, независимо от того, сколько раз рекурсии выполняется из-за неизменности в SML/NJ.

Любые идеи будут полезны!

+0

Можете ли вы разместить весь свой код? –

ответ

0

Поскольку вы не отправляли весь код, я создал простую здесь:

fun evens(int_list: int list) = 
    let fun evens_helper(int_list: int list, times: int) = 
    if null int_list 
    then times 
     else if null (tl int_list) 
    then 
     if (hd int_list) mod 2 = 0 
     then 1 
     else 0 
    else if (hd int_list) mod 2 = 0 
    then 1 + evens_helper(tl int_list, times + 1) 
    else evens_helper(tl int_list, times) 
    in evens_helper(int_list, 0) 
    end 

Чтобы сделать то, что вам нужно, самое простое, что нужно сделать, это создать вспомогательную функцию внутри функции , что делает то же самое, что и исходная функция, но еще один аргумент (ваш счетчик). Если ваш счетчик должен быть активирован, вы вызываете рекурсивный вызов с помощью счетчика +1. Если вы не хотите активироваться, вызовите рекурсивную функцию, используя одно и то же значение счетчика.

Если вы еще этого не сделали, разместите весь свой код, чтобы я мог его увидеть.

0

Ваше выражение if/then должно иметь аналогичный тип. Вот краткий пример, который может оказаться полезным.

fun how_many_evens (from,to)= 
    let fun count_even (m,count) = 
    if m > to then count 
     else 
     if m mod 2 = 0 then count_even(m+1,count+1) 
     else count_even(m+1,count) 

    in 
     count_even (from,0) 
    end 
Смежные вопросы