Строковое значение не изменяется в рекурсии - PullRequest
0 голосов
/ 05 ноября 2019

Я пытаюсь изменить строку внутри рекурсии. Вот код: -

using System;


public class Program
{
    public static void Main()
    {
        string s = "abcdc";
        string added = "";
        checkIfPalindrome(s , added);
        Console.WriteLine( added);
    }

    public static void checkIfPalindrome(string s ,  string added)
    {
        //Console.WriteLine(added);
        if(s.Length < 2)
        {
            return;
        }
        if(s[0] == s[s.Length -1])
        {           
            checkIfPalindrome(s.Substring(1,s.Length-2) , added);       
        }
        else
        {           
            added = s[0] + added;           
            checkIfPalindrome(s.Substring(1,s.Length-1), added) ;
        }

    }
}

Вот скрипка для того же: -

<iframe width="100%" height="475" src="https://dotnetfiddle.net/Widget/u4119h" frameborder="0"></iframe>

Я ожидаю, что добавленный объект будет изменен внутри рекурсии и появится в результате вне вызова функции и внутри основного метода, поскольку строка является ссылочным типом. Но значение added литерал - пустая строка. Хотя, когда рекурсия достигает базового случая, она имеет значение ba.

Также правильное значение отражается, когда ключевое слово ref используется для передачи added

Неужели мое понимание неверно?

Ответы [ 2 ]

1 голос
/ 05 ноября 2019

В самом верху вы присваиваете значение added local в вашей функции Main. Но вы никогда не меняете это значение. Вы только когда-либо меняете то, на что указывает аргумент checkIfPalindrome. Это не влияет на локальные added в Main, , если только вы не передадите его по ссылке - используя ref.

Ссылочные типы имеют семантику ссылок, да. Но это не значит, что ссылка на ссылочный тип имеет такое же свойство. Если вы измените значение added, вы получите ожидаемое поведение - но вы только замените ссылку на аргумент - указывая его где-то еще. Конечно, строки в .NET являются неизменяемыми, поэтому вы не можете изменить значение из added - ваш единственный вариант - передать строку по ссылке (или, лучше, сделать ее возвращаемым значением,в любом случае это делает намного более четкую рекурсию).

0 голосов
/ 05 ноября 2019

string - это reference type, но immutable, что означает, что его нельзя изменить после его создания. Каждое изменение строки создает новую строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...