2016-12-13 12 views
3

기본적으로 모듈러스 연산자를 사용하지 않고 두 숫자로 나머지를 계산하는 코드를 구현했지만 막 막막한 상황에 처하게됩니다. 나는 논리를 안다 그러나 나는 f에있는 초보자 다. 그리고 그것을 구현하는 방법을 모른다.모듈러스 연산자를 사용하지 않고 나머지 계산 F #

let rec modulus a b = 
if b = 0 Console.WriteLine("Sorry Wrong Divisor") 
let bool neg = a < 0 
a = abs a 
b = abs b 
modulus(val-divisor,divisor) 

내가 여기에 어떤 도움을 아주 기본적인 실수를 얻고있다 아는 모든 작업이 점점 향한 첫 번째 단계는 들여 쓰기를 수정하고 실제로 유효한 F # 코드로 스케치를 설정하는 것입니다

+0

코드를 계수를 계산할 수 이해하기 어렵다. 들여 쓰기가 올바르지 않고 equals 연산자가 잘못 사용 된 것 같아요 –

+0

Tomas Petricek이 지적한 것 외에'neg '라는 값을 만듭니다 (그리고'let bool'을 거기에 놓을 필요는 없습니다 : let neg = a < 0 '이면 충분). 그러나 당신은 결코 그 가치를 사용하지 않습니다. 어딘가에'if' 문을 쓰려고했을 것입니다. 그리고 F #의'if' 문은'if (condition) then'(value-if-true) else'(false if if false) '문으로 쓰여집니다. 'else'는'value-if-true'가'unit' 유형으로 해석되면 선택 사항입니다. 그 의미를 아직 이해하지 못했다면, 걱정할 필요는 없습니다.'if' 문장의'else' 부분은 거의 선택 사항이 아닙니다. – rmunn

답변

9

컴파일 및 실행 - 구현의 논리를 수정하는 다음 단계로 넘어갈 수 있도록 도와줍니다.

당신과 유사하고 실제로 실행되는 최소한의 코드는 다음과 같습니다 : 나는 들여 쓰기를 고정

let rec modulus value divisor : int = 
    printfn "value=%d, divisor=%d" value divisor 
    if divisor = 0 then Console.WriteLine("Sorry Wrong Divisor") 
    let neg = value < 0 
    let value = abs value 
    let divisor = abs divisor 
    modulus (value-divisor) divisor 

modulus 10 5 
  • - F 번호 민감한 들여 쓰기 때문에이 문제입니다.
  • 나는 leta = abs a 교체 - let 키워드가 숨어 새 변수를 정의하는 기존의 (당신은 기존의 변수를 변이 할 수 없기 때문에 - 그들은 F #으로 불변)
  • 내가 지속적으로 divisorvalue 이름을 사용하도록 변수의 이름을 변경 이 기능은 (는 현재 결코 종료 조건을 검사하지 않기 때문에이 무한 루프에 들어갈 것이다!)를 실행하는 방법을 볼 수 있도록
  • 가 나는 결과 말을 유형 약어 : int를 추가했다
  • printfn 추가 int - as 함수는 결코이 필요하며, 반환하지 않습니다 (하지만 당신은이 문제를 해결하면 당신은 그것을 제거 할 수 있습니다) 작성된
+0

정말 고맙습니다. 예 들여 쓰기는 F #에서 매우 민감하기 때문에 관련된 중괄호가 없습니다. –

0

당신은 간단한 방법으로

let modulus a b= 
    if b = 0.0 then failwith "Cannot divide by zero" 
    a - b * truncate(a/b); 
+0

내 요구 사항은 재귀 함수를 사용했지만 감사합니다. –

+0

잘못된 코딩. 일반적으로 부동 소수점 숫자는 항등 연산자와 안정적으로 비교할 수 없습니다. –