2017-11-08 1 views
-5

Book 클래스의 배열을 만들 겠지만 Book 클래스의 내용은 믿을 수 없지만이 정확한 예제에서 활용할 필요는 없지만 Comparable을 구현했습니다. 나는 String이라는 것을 반환 할 필요가있다. 과거 예제에서 우리는 항상 void를 사용하지만 System.out.println을 사용하도록했습니다. 나는 전체적으로 재귀에 대해 낮은 파악력을 가지고 있으므로 누군가가 도와 주면 크게 감사 할 것입니다. 당신이재귀를 사용하여 객체 배열을 인쇄하는 방법은 무엇입니까?

+0

이것은 기본 재귀를 학습하기에 매우 복잡해 보입니다. 먼저 재귀를 사용하여 일부 숫자 시퀀스 (예 :'1 2 3 ... 10')를 출력하는 것에 익숙해 지십시오. 그런 다음이 작업에 대해 생각하십시오 – Fureeish

+0

@Fureeish 어떻게하는지는 알고 있지만 모든 예제에서는 String 유형으로 출력하지 않지만 항상 void를 사용하므로 출력을 작성하는 방법을 잘 모르겠습니다. –

+0

이 경우 필자는 ** 첫 번째 'n'숫자를 ** 합산하는 재귀 적 방법. 힌트 : 메소드 서명이'int sum (int n)'이라면, 그 메소드 내부의 코드 부분은'return n + sum (n - 1);'이 될 것이다. 조심하십시오 - 결말 조건에 대해 다시 읽으십시오. 기본 재귀를 학습하면 종종 무한 루프 또는 메서드 호출 – Fureeish

답변

-1

방법에서 문자열을 반환하려면 감사 당신은 단지 방법 헤더에 그렇게 말 :

public String getName(){ 
    return this.name; 
} 

당신이 대회는 .toString() 방법을 사용하는 것입니다 객체의 문자열 표현을 반환합니다. String.format()은 매우 유용합니다.

public String toString(){ 
    return String.format("Name: %s Number of pages: %d", this.name, this.numPages); 
} 

편집 :

public static String arrayAsString(Book[] books, int startIndex){ 
    if(startIndex > books.length - 1) return null; 

    String toAppend = arrayAsString(books, startIndex + 1); 

    if(toAppend == null) return books[startIndex].toString(); 
    else return books[startIndex].toString() + " " + toAppend; 
} 
+1

이 발생하며이 문제는 "* 재귀 * 사용"부분에 어떻게 영향을 미칩니 까? – Fureeish

+0

당신이 뭔가를 놓치지 않았거나 원래 질문에서 뭔가를 남겨 두지 않으면 OP 질문과 관련된 문자열을 반환하기 위해 재귀가 필요하지 않습니다. –

+0

그는 ** 문자 그대로 ** 제목 **에 "* using recursion *"부분을 넣었습니다 ... 그는 또한 사용자 정의 된 객체 배열을 언급했습니다 – Fureeish

0

재귀가이 문제에 대한 올바른 전략되지 않습니다 :

재귀를 사용하여 이러한 객체의 배열을 인쇄합니다. 숙제 도움을 요청하는 것처럼 들리므로 학교의 TA 나 다른 자료를 질문의 문맥을 더 잘 이해할 수 있도록 참여하는 것이 좋습니다. 당신이 그것을 언급했기 때문에 : Comparable을 구현하는 것은 배열 인쇄에 필요하지 않습니다. 배열이 인 경우 배열을 입력하려면 Comparable이 필요합니다. 말했다

, 여기 당신이 필요 같은 소리 구성 요소 :

  1. 귀하의 Book 클래스는 캐릭터 라인 표현을 필요로한다. 자바에서 canonically 당신이 toString 방법이 인코딩 :

    class Book 
    { 
        private String title; 
    
        // ...other Book methods defined here... 
    
        public String toString() 
        { 
         return this.title; // Or whatever the correct string representation of your Book is. 
        } 
    } 
    
  2. 을 당신이 초기화 Book의 배열을 가정, 당신의 main 기능에 말한다. 일반적으로 목록을 반복해서 인쇄합니다. 그것은 훨씬 간단합니다. 이 답변보기 : How to print out individual Strings from Iterable<String>.

    그러나 귀하의 질문은 재귀에만 해당됩니다.

    1. 베이스 케이스
    2. 재귀 단계

    순회 목록 재귀 공통 기본 케이스는 빈리스트 인을위한 함수형 프로그래밍에서 일반적입니다 : 재귀 함수는 항상 두 가지 요소가 필요합니다. Java 배열은이 패턴에 적합하지 않지만 과 같은 일부 구현은 List입니다. 즉, 재귀 적 단계가 카운터를 증가 시키도록 배열을 사용할 수 있습니다. 이것은 문자 그대로 for 루프에서리스트를 반복하는 것에 비해 이점이 없으며, 스택 오버 플로우가 발생하기 쉽다는 큰 단점이 있습니다. 그러나, 당신은

    public String stringifyBooks(Book[] books, int currentIndex) 
    { 
        // From https://stackoverflow.com/questions/47169798/how-to-print-an-array-of-objects-using-recursion 
        if (currentIndex >= books.length || currentIndex < 0) 
        { 
         // Base case 
         return ""; 
        } 
        else 
        { 
         // Recursive step 
         return books[currentIndex].toString() + ", " + 
          stringifyBooks(books, currentIndex + 1); 
        } 
    } 
    

    이제 Book의 배열 및 초기 인덱스 stringifyBooks를 호출 할 수 있으며 해당 인덱스에서 시작 책의 모든 문자열을 얻을 것이다 ... 재귀에 대해 물었다. 책 배열의 길이보다 큰 초기 색인을 전달하거나 책이 빈 배열 인 경우 어떻게됩니까?

    직접 해보면이 솔루션이 후행 ", "을 생성합니다. 이 문제를 피하려면 (a) 기본 케이스를 조정하거나 두 번째 "기본 케이스를 추가"하거나 (b) 재귀 함수 호출을 통해 기본 케이스에 도달 한시기를 식별하는 재귀 적 단계를 조정할 수 있습니다 (힌트 : 기본 케이스에 의해 반환 된 값을 확인하고 재귀 적 단계에서이를 계산합니다).

    재귀 사용은 Java의 스택 크기 제한으로 인해 어려움을 겪습니다. 매우 긴 배열의 책 (10,000 개)에서 시험 해보면 제한에 부딪 힐 수 있습니다. 또한 모든 문자열 연결 비용은 상당히 클 것입니다. 덧붙여 말하면 반복 알고리즘 (예 : for 루프를 사용하는 문자열)에 문자열을 축적 한 경우 해당 비용을 지불해야합니다. Java는 이런 이유로 내장 된 StringBuilder을 제공합니다. + 연산자를 사용하여 각 재귀 단계에서 문자열을 연결하는 대신 재귀 단계에서 StringBuilderappend 개를 가져 오기 위해 위의 코드를 수정할 수 있는지 확인하십시오. (이 수정 stringifyBooks이 String 대신 void을 반환 의미하는 것을 주 - StringBuilder 매개 변수가 반환 가치 본질적으로 끝납니다.)

    마지막으로, 대신 Book[]List<Book>을 사용하고자하는 경우, 당신은 재귀를 구성 할 수 function 여기서, (1) 기본 케이스가 ListisEmpty 함수를 확인하고 ""을 반환합니다. (2) 재귀 적 경우는 목록의 첫 번째 요소의 문자열을 만들고, 첫 번째 요소를 제거하고, 목록의 재귀 함수를 호출 한 다음 첫 번째 요소의 문자열 + 재귀 함수 호출의 결과를 반환합니다. (또는 같은 일을하지만 StringBuilder을 사용합니다.) 이렇게하면 currentIndex 변수가 제거됩니다. 이 방법은 책 목록을 파괴하므로 함수를 사용한 후에 필요한 경우 재귀 함수를 호출하기 전에 복제해야합니다.

관련 문제